关于浮点数精度的问题

   在项目里遇到一个很诡异的问题,因为有一些浮点数的计算,总是失败,所有将出问题的变量打印到日志里。
   结果如下:
引用
   ====reicpe_blocked  1.9
   ====real_block 1.9

   是这样的,recipe_blocked变量值是:1.9,real_block变量值是1.9,两个结果相减结果是result,但是在程序对result有个判断,判断result是否大于0小于0还是等于,本来正确的结果是等于,但是最后却到了小于这里。
    google搜索了下,找到了两个关于ruby浮点数的帖子。
    http://www.iteye.com/problems/37144
    http://pickerel.iteye.com/blog/796405
    在本地试了下
  
引用
>> e = 0.477+(0.432-0.477)*(5-4.7)/(5.7-4.7)
=> 0.4635
>> e.round(3)
=> 0.463
>> a=0.4635
=> 0.4635
>> a.round(3)
=> 0.464



引用
>> 10.12*100
=> 1012.0
>> (10.12*100).to_i
=> 1011
>> (10.12*100).to_f.to_i
=> 1011
>> (10.12*100).to_f.round(2).to_i
=> 1012
>> (10.12*100).to_s.to_i
=> 1012



引用
>> e = (0.477).round(3)+((0.432-0.477)*(5-4.7)/(5.7-4.7)).round(3)
=> 0.464
>> e = (0.477).round(4)+((0.432-0.477)*(5-4.7)/(5.7-4.7)).round(4)
=> 0.4635
>> e.round(3)
=> 0.463
>> e.inspect
=> "0.4635"
>> e.to_f.round(3)
=> 0.463
>> e.to_s.to_f.round(3)
=> 0.464


引用
>> e=0.477+(0.432-0.477)*(5-4.7)/(5.7-4.7)
=> 0.4635
>> e-0.4635
=> -5.55111512312578e-17
>> e.to_s.to_f-0.4635
=> 0.0

看来加上to_s.to_f还是有效果的。还是精度的问题。


你可能感兴趣的:(Ruby)