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)
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |