Rails:数学计算不正确.它的价格是.00000000000001

Hoo*_*ils 4 ruby ruby-on-rails ruby-on-rails-4

我的rails应用程序没有正确进行数学运算.我认为这与变量类型(int vs float)有关,但不确定是什么问题.

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

def lean_mass
 self.weight * 0.01 * (100 - self.body_fat)
end
Run Code Online (Sandbox Code Playgroud)

哪里

Stat.weight = 140
Stat.body_fat = 15
Run Code Online (Sandbox Code Playgroud)

它返回119.00000000000001而不是119.

但是,在哪里

Stat.weight = 210
Stat.body_fat = 15
Run Code Online (Sandbox Code Playgroud)

它返回178.5正确的数字.

任何人都知道为什么它会抛出那么小的小数?

weight的数据类型是整数,如果有帮助,body_fat是十进制的.

spi*_*ann 14

浮点数不能精确地表示所有实数.此外,浮点运算不能精确地表示每个算术运算.这导致了许多令人惊讶的情况.

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

0.1 + 0.2
#=> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

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

您可以使用BigDecimal而不是浮点数来避免大多数此类问题:

require 'bigdecimal'
BigDecimal.new('0.01') * 140 * (100 - 15)
#=> 119.0
Run Code Online (Sandbox Code Playgroud)