Подтвердить что ты не робот

Decimal.Round по умолчанию для MidpointRounding

Применяется следующее:

var rounded = Decimal.Round(7.635m, 2);
//rounded: 7.63

Это, для меня, неправильное и неожиданное поведение. Я бы предположил, что значение округлено до 7.64.

Чтобы достичь этого, я могу сделать:

var rounded = Decimal.Round(7.635m, 2, MidpointRounding.AwayFromZero);
//rounded: 7.64

Как это не является поведением Decimal.Round по умолчанию? Хорошая причина для этого?

4b9b3361

Ответ 1

Как это не может быть поведение по умолчанию Decimal.Round? Любой хороший причина для этого?

Если вы посмотрите на документацию Decimal.Round Method (десятичный)

Поведение этого метода соответствует стандарту IEEE 754, раздел 4. Такое округление иногда называют округлым или четным или округление банкира. Это сводит к минимуму ошибки округления, возникающие в результате последовательно округляя среднее значение в одном направлении. это эквивалентно вызову метода Round (Decimal, MidpointRounding) с аргумент режима MidpointRounding.ToEven.

Ответ 2

Из Math.Round(Decimal, Int32) Метод

Поведение этого метода следует стандарту IEEE 754, раздел 4. Это вид округления иногда называют округлением до ближайшего, или банкира округления. Он минимизирует ошибки округления, которые являются результатом последовательного округляя среднее значение в одном направлении.

Этот метод эквивалентен вызову метода Round в режиме аргумент MidpointRounding.ToEven. Если есть один ненулевой цифра в d справа от десятичной запятой и ее значение равна 5, цифра в десятичной запятой округляется, если она нечетна, или остался без изменений, если он четный. Если d имеет меньше дробных цифр, чем десятичные числа, d возвращается без изменений.

Ответ 3

Причина заключается в том, что они реализовали метод, следующий за стандартом IEEE 754, раздел 4. Это называется округлением до ближайшего или иногда округления банкиров.

Это просто один из многих способов сделать округление, и они выбирают этот. См.: http://en.wikipedia.org/wiki/Bankers_rounding

И для получения дополнительной информации: Почему .NET использует округление банкира по умолчанию?