Math.Round для десятичного - PullRequest
       4

Math.Round для десятичного

3 голосов
/ 06 сентября 2010

Я использую этот код:

decimal d = 1.45M;

Console.WriteLine((System.Math.Round(d,0,MidpointRounding.AwayFromZero).ToString()));

Здесь я ожидаю, что на выходе будет 2, потому что 1,45 при округлении до 1 десятичного знака будет 1,5, что при следующем округлении до 0 десятичных знаков должно быть 2 *.

Однако я получаю ответ как 1.

Правильно ли мое предположение? Если это так, это ошибка в Math.Round?

Ответы [ 3 ]

8 голосов
/ 06 сентября 2010

Нет, это не ошибка. Ваша логика говорит о округлении дважды, но вы получили только один звонок на Round. 1,45 меньше средней точки между 1 и 2 (1,5), поэтому округляется до 1.

Если вы хотите, чтобы код следовал вашей логике, вы можете сделать это:

using System;

class Test
{
    static void Main()
    {
        decimal d = 1.45m;
        d = Math.Round(d, 1, MidpointRounding.AwayFromZero); // 1.5
        d = Math.Round(d, 0, MidpointRounding.AwayFromZero); // 2

        Console.WriteLine(d);
    }
}

Если вы не укажете , что вы хотите две фазы округления, хотя (как указано выше) .NET просто сделает одну.

0 голосов
/ 06 сентября 2010

Ваше понимание неверно.

Вы указали десятичное значение 0, поэтому предоставленное значение будет округлено до целого числа.

Из MSDN "Если значение первой цифры в d справа от десятичной позиции, представленной параметром десятичных дробей, равно 5, цифра в десятичной позиции округляется в большую сторону, если она нечетная, или влево, если она четная «

Поскольку первое значение справа от десятичной точки равно 4, а не пяти, возвращаемое значение равно 1.

Если бы десятичное значение было 1.55, то ответ был бы 2.

Если бы десятичное значение было 2,55, то ответом было бы и 2!

Поскольку вы задаете поведение округления средней точки, это будет изменено, но вы, когда вы просите, чтобы раунд работал с десятичными числами = 0, он будет проверять только первую цифру после десятичной запятой.

Фактически, если вы указали десятичные дроби = 1, как в

Math.Round(1.45,1)

Тогда ваш ответ будет 1.4, поскольку он проверяет вторую цифру после десятичной точки для округления первой.

0 голосов
/ 06 сентября 2010

Вы не можете выполнять круглые действия одна цифра за одной цифрой!Здесь вы говорите:

1.45 rounded to 1 decimal place:1.5
1.5 rounded to 0 decimal place:2

Это не правильно, здесь 1.45, округленное до 0 цифр, вам нужно проверить только .4.

...