错误的Ruby Float和BigDecimal减法结果

时间:2010-06-08 09:20:39

标签: ruby-on-rails ruby

我正在跑步:

[~/ruby/rails/sas]$ ruby --version
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]

在Mac Snow Leopard 10.6.3

任何人都可以帮忙解释为什么Float和BigDecimal减法可能是错误的。

[~/ruby/rails/sas]$ console
Loading development environment (Rails 2.1.1)
>> num = 30.0
=> 30.0
>> num.class
=> Float
>> ex = 28.04.to_d
=> #<BigDecimal:105367e40,'0.284E2',8(8)>
>> ex.class
=> BigDecimal
>> num - ex
=> 1.6
>> _.class
=> Float
>> 

我希望结果应该是1.96,我知道也许不建议使用2种不同的数据类型进行算术运算,但这种行为很奇怪。

从现在开始,我必须在进行任何算术运算之前检查变量数据类型。

希望有人能够让我了解正在发生的事情。

2 个答案:

答案 0 :(得分:3)

这是Rails 2.1.1中to_d方法的问题。我试过

ex = BigDecimal.new '28.04'
#=> #<BigDecimal:1209328,'0.2804E2',8(8)>

并使用Rails 2.3.5

 ex = 28.04.to_d
 #=> #<BigDecimal:219ea18,'0.2804E2',8(8)>

和     num - ex     #=&GT; 1.96

工作正常

因此,您有三个选项可以升级rails版本或覆盖to_d方法,或者只使用BigDecimal.new '28.04'代替to_d

答案 1 :(得分:0)

问题是 rails 2.1.1,因为我尝试使用rails 2.3.8并获得相同的结果

[~/ruby/rails/sample_2.3.8]$ script/console
Loading development environment (Rails 2.3.8)
>> BigDecimal("28.04")
=> #<BigDecimal:1033eccc8,'0.284E2',8(8)>
>> 

我非常确定问题是Ruby 1.8.7 p173标配Snow Leopard 10.6.3,如下所示:

http://redmine.ruby-lang.org/issues/show/1910