Предполагается, что перегрузка MidpointRound.AwayFromZero округляет 5 в большую сторону в ситуации округления.
ПРИМЕР: Math.Round(1.5, 1, MidpointRounding.AwayFromZero);
Это округляет от 1,5 до 2.
Однако, когда я пытаюсь Math.Round(1.025, 2, MidpointRounding.AwayFromZero);
, оно округляется до 1,02. Хотя предполагается округление до 1,03.
Кто-нибудь знает, почему это происходит? Спасибо!
Значение 1.025
не может быть представлено точно как тип double
. У чисел с плавающей запятой есть эта проблема. См. Почему числа с плавающей запятой неточны?.
Когда вы пишете 1.025
как число double
, внутри оно будет немного меньше, чем 1.025
. Вот почему округление дает неожиданное значение.
Когда вы имеете дело с деньгами или другими вещами, где вы хотите, чтобы значение было точно таким же, как отображается, используйте тип decimal
вместо double
:
decimal roundedValue = Math.Round(1.025m, 2, MidpointRounding.AwayFromZero);
Обратите внимание, что m
после числа превращает число в литерал типа decimal
.
Большое спасибо за подробный ответ! Это полностью решило мою проблему, преобразовав двойное число в десятичное!