Как сказал Матфей, 18.565 не может быть точно представлено. Фактическое используемое значение составляет 18,565000000000001278976924368180334568023681640625 (найдено с использованием DoubleConverter ), что явно за полпути. Теперь у меня возникает ощущение, что иногда Math.Round
будет рассматривать значение, которое на фактически выходит за половину пути, но которое так же близко к половине пути, как может быть точно представлено, как точно в этой точке. Тем не менее, я не видел никакой документации, описывающей ситуации, в которых это применяется, и, очевидно, этого не происходит в этом случае. Я бы не хотел на это полагаться.
Даже округленное значение не совсем 18,57, конечно. Это на самом деле 18.57000000000000028421709430404007434844970703125.
По сути, если вы действительно, действительно хотите точно представлять десятичные значения, вы должны использовать decimal
. Это не только с точки зрения Math.Round
- это касается каждого аспекта обработки значений с плавающей запятой.
То, что действительно дает правильное значение для Math.Round
, конечно:
decimal m = 18.565m;
Console.WriteLine(Math.Round(m, 2)); // Prints 18.56