我在Math.Round中有一个错误,没有任何解释。
当我做

Math.Round(81.725, 2, MidpointRounding.AwayFromZero)


结果是81,72,但当我使用Decimal.Round进行相同操作时

Decimal.Round(81.725M, 2, MidpointRounding.AwayFromZero)


其结果是81,73

我不明白为什么,您有系统地使用Math.Round的解决方案吗?

最佳答案

在理解double的工作原理之前,您不应该先讨论错误,而与decimal的差异可以解释您所看到的行为。

double是具有以下结构的实数的最佳近似值:

number = sign * mantissa * 2 ^ exponent


因此,数字81.725,当表示为double时,实际上是:

1 * 2875442808959795 * 2^-45 = 81,724999999999994315658113919199


现在您应该了解为什么Math.Round(81.725, 2)解析为81.72而不是81.73的原因。

decimal不会发生这种情况,因为decimaldouble相反,可以准确地表示81.725。这是由于decimal中的比例因子是10的幂的事实。

这种增加的精度显然是以速度,空间和范围为代价的。在注释中提供的与另一个SO问题的链接中,对何时选择一种或另一种进行了很好的解释。

关于c# - Math.Round错误81.725 MidpointRounding.AwayFromZero = 81.72,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43226142/

10-12 18:06