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
,