Rails:数学计算不正确。它关闭了 .00000000000001

Rails: Math not computing correctly. It's off by .00000000000001

我的 rails 应用程序计算不正确。我认为这与变量类型(int vs float)有关,但不确定哪里出了问题。

根本问题是我的 Stat 模型中的这个方法:

def lean_mass
 self.weight * 0.01 * (100 - self.body_fat)
end

哪里

Stat.weight = 140
Stat.body_fat = 15

它 returns 119.00000000000001 而不是 119

但是,

Stat.weight = 210
Stat.body_fat = 15

它returns178.5,正确的数字。

有人知道为什么要输入那个小的小数吗?

重量的数据类型是整数,如果有帮助,body_fat 是小数。

浮点数不能精确表示所有实数。而且浮点运算不能精确表示每一个算术运算。这会导致许多令人惊讶的情况。

显示此行为的一个简单示例:

0.1 + 0.2
#=> 0.30000000000000004

我建议阅读:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

您可以通过使用 BigDecimal 而不是浮点数来避免大部分问题:

require 'bigdecimal'
BigDecimal.new('0.01') * 140 * (100 - 15)
#=> 119.0

看看rubyBigDecimal

例如,尝试:

sum = 0
10_000.times do
  sum = sum + 0.0001
end
print sum #=> 0.9999999999999062

并与以下输出对比:

require 'bigdecimal'

sum = BigDecimal.new("0")
10_000.times do
  sum = sum + BigDecimal.new("0.0001")
end
print sum #=> 0.1E1