BigDecimal to_s与to_f不匹配

时间:2010-04-01 21:10:32

标签: ruby-on-rails bigdecimal

BigDecimal类是否已损坏?似乎永远不会发生以下情况: 请注意a.to_f!= a.to_s.to_f

  
    

的A.class     => BigDecimal的

         

a.to_f     => 18658.1072928

         

a.to_s     => “10865.81072928”

         

b.class     => BigDecimal的

         

b.to_f     => 10000.0

         

b.to_s     => “10000.0”

         

(a - b).to_f     => 865.81072928

         

a.to_f - b.to_f     => 8658.1072928

  

关于可能出错的任何想法?我们在服务器上运行ruby 1.8.7p72,在本地机器上运行1.8.7p173。

2 个答案:

答案 0 :(得分:1)

如果您运行的是Mac OS X 10.6.3,那么这可能是一个解释:http://www.abletech.co.nz/2010/03/osx-10-6-3-installs-new-ruby-with-faulty-bigdecimal/

要解决问题,您可以使用RVM

答案 1 :(得分:0)

正如docs所说:

  

<强> to_f

     

返回一个新的Float对象,其值与BigDecimal数字大致相同。正常精度限制和二进制浮点运算的内置错误适用。

这意味着ruby中的Float就像浮动一样:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Float不是每个数字都可以表示。在这种情况下,数字是四舍五入的。