四舍五入

时间:2018-07-13 09:23:15

标签: c#

我注意到Math.Round(double,int,MidpointRounding)函数的行为很奇怪。

System.Math.Round(177777.385,2, MidpointRounding.AwayFromZero)== 177777.39
System.Math.Round(17777.385,2, MidpointRounding.AwayFromZero) == 17777.38
System.Math.Round(1777.385,2, MidpointRounding.AwayFromZero) == 1777.39

我也测试了十进制,这是结果:

System.Math.Round((decimal)177777.385,2, MidpointRounding.AwayFromZero)== 177777.39
System.Math.Round((decimal)17777.385,2, MidpointRounding.AwayFromZero) == 17777.39
System.Math.Round((decimal)1777.385,2, MidpointRounding.AwayFromZero) == 1777.39

在所有我希望的X.39中(因为这是AwayFromZero舍入的结果),但是舍入 17777.385 似乎无效。

有人可以解释为什么会这样吗? 我怀疑这与它们的二进制表示形式有关,但我不确定。

我正在使用Visual C#Interactive Compiler版本2.8.0.62830

1 个答案:

答案 0 :(得分:1)

例如17777.385 * 100(四舍五入为指定的位数,然后先乘以10 digits ,然后四舍五入)将精确为1777738.499999999999976716935634613037109375,如您所见,它不是中间值,因此不受影响通过中途四舍五入标志。这不是因为乘法,输入值已经是17777.38499999999839928932487487964630126953125。

在177777.385 * 100中,输入实际上也是一个有趣的数字,但是乘以100恰好导致恰好 17777738.5,该值受中途舍入标志的影响。