2010-06-08 68 views
0

我运行:错误红宝石浮球BigDecimal的减法运算结果

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

在Mac雪豹10.6.3

谁能帮助解释为什么浮球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种不同的数据类型的算术运算不建议使用,但这种行为是那么的陌生。

从现在开始,我必须在做任何算术运算之前检查变量数据类型,这似乎是明智的。

希望有人能给我一个关于正在发生的事情的见解。

+1

这不是由两种类型的混合。从输出“#”可以看到你的变量ex的值是28.4,这个问题必须发生在to_d函数中。我无法提供更多信息,因为我无法重现您的问题。 – 2010-06-08 09:27:32

回答

0

问题是导轨2.1.1,因为我与轨道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)> 
>> 

我很肯定,问题是红宝石1.8.7 P173自带的标准雪豹10.6.3为张贴在这里:

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

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 - 前 #=> 1.96

工作的罚款

所以,你有三种选择要么升级您的导轨版本或覆盖to_d方法或仅使用BigDecimal.new '28.04'而不是to_d