为什么当我执行以下操作时...
Math.Round(0.75, 1, MidpointRounding.AwayFromZero)
我得到0.8
但是当我执行以下操作时...
Math.Round(0.575, 2, MidpointRounding.AwayFromZero)
我没有得到0.58。相反,我得到0.57。我想要的是5以上的值,因此0.575应该是0.58。
最佳答案
问题是您不能精确地将0.575表示为二进制浮点数(例如, double 数)。尽管我不清楚,但最接近的表示形式似乎可能要低一些,因此在四舍五入时会使用真实的表示形式并向下取整。
如果要避免此问题,请使用更合适的数据类型。 decimal
将执行您想要的操作:
Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)
结果:
0.58
0.75做正确的事情的原因是它很容易用二进制浮点表示,因为它是简单的1/2 + 1/4(即2 ^ -1 + 2 ^ -2)。通常,任何二的幂的有限和都可以用二进制浮点表示。异常(exception)是当您的2的幂跨度太大时(例如2 ^ 100 + 2不能精确表示)。
编辑添加:
Formatting doubles for output in C#可能对理解为什么很难理解0.575不是0.575感兴趣。接受的答案中的DoubleConverter将显示0.575作为精确字符串是
0.5749999999999999555910790149937383830547332763671875
您可以从中看到为什么舍入给出0.57。