Округление.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Округление.

Сообщение oskolok_vatbI » 21.02.2010 (Вс) 15:24

Скажите, как округлять значения до десятых, чтобы дробная часть всегда состояла из четного числа, например:
23.018 --> 23.0
23.107 --> 23.2
23.274 --> 23.2
23.174 --> 23.2
Это и есть банковское округление ? Если да, то какая функция его выполняет (если, вообще, такая есть) ? Спасибо.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Округление.

Сообщение Dmitriy2003 » 21.02.2010 (Вс) 15:43

oskolok_vatbI писал(а):Это и есть банковское округление ?

Банк Сатурна ?

Код: Выделить всё
Console.WriteLine("{0}", Math.Round(23.018, 0-[15], MidpointRounding.ToEven | MidpointRounding.AwayFromZero));
Console.WriteLine("{0}", Math.Round(23.107, 0-[15], MidpointRounding.ToEven | MidpointRounding.AwayFromZero));
Console.WriteLine("{0}", Math.Round(23.275, 0-[15], MidpointRounding.ToEven | MidpointRounding.AwayFromZero));
Console.WriteLine("{0}", Math.Round(23.174, 0-[15], MidpointRounding.ToEven | MidpointRounding.AwayFromZero));

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Округление.

Сообщение oskolok_vatbI » 21.02.2010 (Вс) 16:22

Что-то не совсем понял.
MidpointRounding - для чисел которые находятся посередине. И число 23.107 округляется до 23.1, а мне нужно чтобы стало 23.2.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Округление.

Сообщение FireFenix » 21.02.2010 (Вс) 16:49

Код: Выделить всё
Dim m As Decimal = 23.107
MsgBox(Math.Ceiling(m * 10) / 10)

+MidpointRounding.ToEven
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Округление.

Сообщение iGrok » 21.02.2010 (Вс) 18:27

И нет, это не банковское округление. Там всё немного по другому.
label:
cli
jmp label

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Округление.

Сообщение Admiralisimys » 22.02.2010 (Пн) 12:23

А как вам такой подход?
Код: Выделить всё
Dim iMass() As Single = {23.018, 23.107, 23.274, 23.174}
For i As Integer = 0 To iMass.Length - 1
    Console.Write(iMass(i))
    iMass(i) *= 10
    iMass(i) = Math.Truncate(iMass(i))
    If (iMass(i) Mod 2) Then
        iMass(i) += 1
    End If
    iMass(i) /= 10
    Console.WriteLine(" --> " & iMass(i))
Next

Сначала переносим интересующую десятую к целым, помножив на 10. После отбрасываем все остальные числа после запятой, применив округление Math.Truncate().
Если число уже парное разделить его на 10, дабы вернуть к первоначальному порядку с запятой, если не парное, предварительно прибавляем единицу.
Результат работы программы
23,018 --> 23
23,107 --> 23,2
23,274 --> 23,2
23,174 --> 23,2

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Округление.

Сообщение oskolok_vatbI » 22.02.2010 (Пн) 13:46

Я сделал так:
Код: Выделить всё
        Dim m As Double = 23.018
        Dim Res As Double
        If Math.Ceiling(m * 10) Mod 2 = 0 Then
            Res = Math.Ceiling(m * 10) / 10
        Else
            Res = (Math.Ceiling(m * 10) - 1) / 10
        End If

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Округление.

Сообщение Alec » 23.02.2010 (Вт) 21:22

а если разделить на два, округлить и умножить на два?
Иногда лучше вовремя остановиться...
И начать заново!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList