为什么1.001 + 0.001不等于1.002?

时间:2016-03-16 18:06:01

标签: ruby math floating-point

我有一些代码:

num1 = 1.001
num2 = 0.001
sum  = num1 + num2
puts sum

我期待1.002000,但我得到1.0019999999999998。为什么会这样?

2 个答案:

答案 0 :(得分:0)

这是一个常见的基本问题,分数值的二进制表示,并不是特定于Ruby的。

由于floating-point numbers被实现为二进制值的方式,有时在您对“正常”十进制数学的预期与实际结果之间存在显着差异。 Ruby's default representation of floating-point numbers也不例外 - 因为它基于行业标准的双精度(IEEE 754)格式,它在内部将非整数表示为二进制值,因此其近似值don't quite line up具有十进制值

如果您需要在Ruby中进行十进制计算,请考虑使用BigDecimaldocumentation):

require 'bigdecimal'
num1 = BigDecimal.new("1.001")
num2 = BigDecimal.new("0.001")
puts num1 + num2 #=> 0.1002E1

答案 1 :(得分:-1)

在一个完美的世界中是的,你期望1.002000,但是由于浮点算术运算的舍入而出现错误,你可以检查web机器epsilon或只是浮点数。 例如,您可以像这样计算相对错误,并且ruby语言的错误机器是1e-15

f = 0.0
100.times { f += 0.1 }
p f                            #=> 9.99999999999998       # should be 10.0 in the ideal world.
p 10-f                         #=> 1.9539925233402755e-14 # the floating-point error.