Предполагается, что перегрузка 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.
Большое спасибо за подробный ответ! Это полностью решило мою проблему, преобразовав двойное число в десятичное!