为什么第一次调用Round(Double)方法的值为11.5会返回11而不是12?

Iva*_*iro 2 .net c# floating-point

根据http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx上发现的MSDN文章,浮点值.1没有有限的二进制表示,第一次调用Round(Double)方法值11.5返回11而不是12.我无法清楚地理解,为什么会发生?

Jon*_*eet 15

第一个电话并没有真正使用11.5.由于重复添加0.1会导致错误累积,因此使用的值略小于 11.5.如果您使用my DoubleConverter.ToExactString来显示传入的确切值,那么这是输出:

11.0999999999999996447286321199499070644378662109375 --> 11
11.199999999999999289457264239899814128875732421875 --> 11
11.2999999999999989341858963598497211933135986328125 --> 11
11.39999999999999857891452847979962825775146484375 --> 11
11.4999999999999982236431605997495353221893310546875 --> 11
11.599999999999997868371792719699442386627197265625 --> 12

11.5 --> 12
Run Code Online (Sandbox Code Playgroud)

那时,所有结果都有意义.


Øyv*_*hen 6

双打通常不完全准确.因此,您的价值可能与11.4999999999999998相似,该值应明确向下舍入为11.

另外,请注意Round的默认舍入方法是Bankers舍入,意味着11.5将舍入为12,但12.5也将舍入为12(对于中点值,它舍入到最接近的偶数,而不是最高的偶数.