关于浮点数精度的问题
在项目里遇到一个很诡异的问题,因为有一些浮点数的计算,总是失败,所有将出问题的变量打印到日志里。
结果如下:
引用 ====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还是有效果的。还是精度的问题。