我在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
不会发生这种情况,因为decimal
与double
相反,可以准确地表示81.725
。这是由于decimal
中的比例因子是10
的幂的事实。这种增加的精度显然是以速度,空间和范围为代价的。在注释中提供的与另一个SO问题的链接中,对何时选择一种或另一种进行了很好的解释。
关于c# - Math.Round错误81.725 MidpointRounding.AwayFromZero = 81.72,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43226142/