C # Math.Round Ошибка? - PullRequest
       2

C # Math.Round Ошибка?

1 голос
/ 31 июля 2011

Хорошо, я понимаю, что в воскресенье рано, поэтому я надеюсь, что мне просто не хватает чего-то очевидного:

У меня есть эта функция:

private decimal CashConversion(decimal amount, decimal ratio)
{
    if (ratio == 1) return amount;

    decimal convertedAmount = amount / ratio;
    return Math.Round(convertedAmount, 2);
}

Когда я вызываю это так:

decimal tax = CashConversion(96.53, 15);

Переменная «налог» равна 6,43.Тем не менее, 96,53 / 15 составляет 6,435333333333333.Округление до 2 мест должно вернуть 6.44.Я что-то здесь упускаю?

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Это действительно то, что ожидается : 6.435 округлилось бы до 6.44:

Когда d находится точно посередине между двумя округленными значениями, результатом является округленное значение, которое имеет четноецифра в [(десятичных + 1) -й десятичной позиции].Например, при округлении до двух десятичных знаков значение 2,345 становится 2,34, а значение 2,355 становится 2,36 [, а значение 2,33653333 становится 2,37].Этот процесс известен как округление до четного или округление до ближайшего.

3 голосов
/ 31 июля 2011

Проверьте документацию для Math.Round : поскольку 2 является четным, а следующая цифра после второй равна 5, значение округляется в меньшую сторону, в соответствии со стандартом IEEE 754, раздел 4. Он называется Банковское округление .

Это не ошибка, а ожидаемое поведение. Возможно, не тот , которого вы ожидали.

Если вы хотите «математически корректное» поведение, вы можете вызвать Decimal.Round (Decimal, Int32, MidpointRounding) , как в:

Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);
2 голосов
/ 31 июля 2011

По умолчанию Math.Round использует округление банкира. Вы, вероятно, ожидаете, что он будет использовать округление средней точки. Чтобы заставить это поведение, попробуйте this :

Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...