为什么当我执行以下操作时...

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。

10-04 16:15