Math.Round(1.225,2) дает 1,23, если не дает 1,22

AFAIK .NET по умолчанию вариант раунда является четным, поэтому Math.Round(1.225,2) должен дать 1,22, но он дает 1,23.

Math.Round(2.225,2) = 2.22 
Math.Round(100.225,2) = 100.22 

все значения, которые я пробовал округлять до ближайшего четного, но только с 1,225 и -1,225, до 1,23 и -1,23.

2 ответа

Решение

Основная проблема заключается в том, что в float а также doubleколичество десятичных разрядов не является частью значения, и точность не является десятичной, а скорее двоичной. И нет конечного двоичного числа, которое может представлять 1.225 именно так.

Итак, когда вы делаете Math.Round(1.225f, 2)вы делаете что-то более похожее Math.Round(1.22500002f, 2) - нет округления средней точки.

Та же проблема появляется с Math.Round(2.225f, 2) - просто "реальное" значение немного меньше, чем 2.225fТаким образом, результат округляется. Но до сих пор нет округления средней точки.

Если вам нужна десятичная точность, используйте decimal, ни float ни double предназначены для десятичной точности - они хороши, например, для физических расчетов, но не для учета.

1.225 не может быть представлен точно в плавающей точке, так что вы действительно округления 1.225000023841858,

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