Как сказал Матфей, текст 18.565 не может быть точно представлен. Используемое значение - 18.565000000000001278976924368180334568023681640625 (найдено по DoubleConverter), что явно выходит за пределы поля. Теперь у меня есть тайное чувство, что иногдаMath.Round
рассмотрит значение, которое составляет на самом деле за пределами полуострова, но которое находится как можно ближе к полуострове, которое может быть точно представлено, как точно at это пункт. Однако я не видел никакой документации, описывающей ситуации, в которой это применяется, и, очевидно, это не происходит в этом случае. Я не хотел бы полагаться на это.
Даже округленное значение не совсем точно 18.57. Это на самом деле 18.57000000000000028421709430404007434844970703125.
Принципиально, если вы действительно заботитесь о значении десятичных значений, вы должны использовать decimal
. Это не только с точки зрения Math.Round
- это относится ко всем аспектам обработки значений с плавающей запятой.
Это делает дать правильное значение для Math.Round
, конечно:
decimal m = 18.565m;
Console.WriteLine(Math.Round(m, 2)); // Prints 18.56
Возможный дубликат [Получение другого результата в Math.Round] (http://stackoverflow.com/questions/1606664/getting-different-result-in-math-round) – Joren