根据在http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx找到的MSDN文章,浮点值.1没有有限的二进制表示,第一次调用Round(Double)方法,值为11.5,返回11而不是12。 我不清楚,为什么会这样?
答案 0 :(得分:15)
使用11.5,第一个电话不是真的。它使用的值略小于 11.5,因为重复添加0.1会导致错误累积。如果您使用我的DoubleConverter.ToExactString
来显示传入的确切值,则输出如下:
11.0999999999999996447286321199499070644378662109375 --> 11
11.199999999999999289457264239899814128875732421875 --> 11
11.2999999999999989341858963598497211933135986328125 --> 11
11.39999999999999857891452847979962825775146484375 --> 11
11.4999999999999982236431605997495353221893310546875 --> 11
11.599999999999997868371792719699442386627197265625 --> 12
11.5 --> 12
此时,所有结果都有意义。
答案 1 :(得分:6)
双打通常不完全准确。所以你的价值可能就像是11.4999999999999998,这个值应该明确地向下舍入到11。
另外,请注意Round的默认舍入方法是 Bankers四舍五入,这意味着11.5将舍入为12,但12.5也将四舍五入为12(对于中点值,它舍入到最近的值偶数,而不是最高的。