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
我的 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