RoR中的简单舍入在一个非常奇怪的实例中不起作用

时间:2012-09-13 20:05:29

标签: ruby-on-rails ruby ruby-on-rails-3

  

可能重复:
  Arithmetic in ruby

status_update模型接受2个值,用它们做一些简单的计算,然后从那里分配'current_lbm'和'current_bf_pct'。

current_lbm和current_bf_pct会产生大量小数,如果我不限制它们,所以我使用.round(2)方法将值限制为2位小数。

这是执行此操作的方法。

after_initialize :default_values
.
.
def default_values      
 if self.current_bf_pct >= 0.5
   self.current_bf_pct /= 100
    if self.current_bf_pct <= 0.04
      self.current_fb_pct *= 100
    end 
 end
 self.current_fat_weight = self.current_weight * self.current_bf_pct
 self.current_lbm = self.current_weight - self.current_fat_weight
 self.current_fat_weight = self.current_fat_weight.round(2)
 self.current_lbm = self.current_lbm.round(2)
end   

结果如下:

09/13/2012 186.0 4.5 177.63 8.37
09/13/2012 187.0 5.5 176.72 10.29
09/13/2012 188.0 6.5 175.78 12.22
09/13/2012 189.0 7.5 174.83 14.18
09/13/2012 190.0 8.5 173.85 16.15
09/13/2012 191.0 9.5 172.86 18.15
09/13/2012 192.0 10.5 171.84 20.16
09/13/2012 193.0 11.5 170.81 22.2
09/13/2012 194.0 12.5 169.75 24.25
09/13/2012 195.0 13.5 168.68 26.33
09/13/2012 196.0 14.499999999999998 167.58 28.42
09/13/2012 197.0 15.5 166.47 30.54
09/13/2012 198.0 16.5 165.33 32.67
09/13/2012 199.0 17.5 164.18 34.82
09/13/2012 200.0 18.5 163.0 37.0   

我的问题是...... 14.499999999999998到底是怎么回事?

这些是视图的结果。 current_bf_pct行是日期中的第3行。它们不是小数,因为我在视图中将它们乘以100。

1 个答案:

答案 0 :(得分:3)

如果您按原样使用显示浮点数,则无法避免这种情况(请参阅Arithmetic in ruby)。我建议你将你的花车转换为字符串进行显示。

示例(您的实际结果可能会有所不同):

>> 7.3-7.2
=> 0.09999999999999964

转换为带小数点后1位的字符串:

>> '%.1f' % (7.3-7.2)
=> "0.1"

'%'运算符是:

的简写
sprintf '%.1f', (7.3-7.2)

阅读sprintf。这是一个学习曲线,但它非常强大。

另一个解决方案是使用BigDecimal(第二个参数是精度 - 确保你理解这意味着什么):

BigDecimal(7.3-7.2, 1).to_s

如果使用足够大的精度,您将再次看到问题:

>> BigDecimal(7.3-7.2, 16).to_s
=> "0.09999999999999964"