MidpointRounding в Math.Round неправильно работает в С#

Предполагается, что перегрузка MidpointRound.AwayFromZero округляет 5 в большую сторону в ситуации округления.

ПРИМЕР: Math.Round(1.5, 1, MidpointRounding.AwayFromZero);

Это округляет от 1,5 до 2.

Однако, когда я пытаюсь Math.Round(1.025, 2, MidpointRounding.AwayFromZero);, оно округляется до 1,02. Хотя предполагается округление до 1,03.

Кто-нибудь знает, почему это происходит? Спасибо!

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение 1.025 не может быть представлено точно как тип double. У чисел с плавающей запятой есть эта проблема. См. Почему числа с плавающей запятой неточны?.

Когда вы пишете 1.025 как число double, внутри оно будет немного меньше, чем 1.025. Вот почему округление дает неожиданное значение.

Когда вы имеете дело с деньгами или другими вещами, где вы хотите, чтобы значение было точно таким же, как отображается, используйте тип decimal вместо double:

decimal roundedValue = Math.Round(1.025m, 2, MidpointRounding.AwayFromZero);

Обратите внимание, что m после числа превращает число в литерал типа decimal.

Большое спасибо за подробный ответ! Это полностью решило мою проблему, преобразовав двойное число в десятичное!

hidden82 21.11.2022 01:24

Другие вопросы по теме