为什么我的BigDecimal对象初始化时出现意外的舍入错误?

在Ruby 2.2.0中,为什么:

BigDecimal.new(34.13985572755337, 9) 

等于34.0但是

 BigDecimal.new(34.13985572755338, 9) 

等于34.1398557

请注意,我在64位计算机上运行它。

用字符串而不是浮点数初始化

通常,使用Floats无法获得可靠的行为。 你错误地用Float值而不是String值初始化你的BigDecimals,这在一开始就引入了一些不精确的东西。 例如,在我的64位系统上:

 float1 = 34.13985572755337 float2 = 34.13985572755338 # You can use string literals here, too, if your Float can't be properly # represented. For example: # # BigDecimal.new("34.13985572755337", 9) # # would be safer, but Float#to_s works fine with the provided corpus. bd1 = BigDecimal.new(float1.to_s, 9) bd2 = BigDecimal.new(float2.to_s, 9) bd1.to_s #=> "0.3413985572755337E2" bd2.to_s #=> "0.3413985572755338E2" bd1.to_f == float1 #=> true bd2.to_f == float2 #=> true 

这是参数的内部表示很重要的情况之一。 因此,您的里程将根据您初始化对象的方式而有所不同。