为什么当我做以下事情?
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正好代表二进制浮点数(例如双精度)。虽然我不太清楚,似乎最接近的表示可能只是稍低一点,所以当舍入它使用真实的表示和舍入。
原文链接:https://www.f2er.com/vb/256000.html如果要避免此问题,请使用更合适的数据类型。小数将会做你想要的:
Math.Round(0.575M,MidpointRounding.AwayFromZero)
结果:0.58
因为它是简单的1/2 1/4(即2 ^ -1 2 ^ -2),所以0.75的正确的事情是容易在二进制浮点表示。一般来说,两个幂的有限和可以用二进制浮点来表示。例外情况是当你的力量超过2范围(例如2 ^ 100 2不完全可表示)时。
编辑添加:
Formatting doubles for output in C#可能在理解为什么它很难理解0.575不是真的0.575的兴趣。 DoubleConverter在接受的答案将显示0.575作为一个精确的字符串是0.5749999999999999555910790149937383830547332763671875你可以看出,为什么舍入给0.57。