我有一些代码:
num1 = 1.001
num2 = 0.001
sum = num1 + num2
puts sum
我期待1.002000
,但我得到1.0019999999999998
。为什么会这样?
答案 0 :(得分:0)
这是一个常见的基本问题,分数值的二进制表示,并不是特定于Ruby的。
由于floating-point numbers被实现为二进制值的方式,有时在您对“正常”十进制数学的预期与实际结果之间存在显着差异。 Ruby's default representation of floating-point numbers也不例外 - 因为它基于行业标准的双精度(IEEE 754)格式,它在内部将非整数表示为二进制值,因此其近似值don't quite line up具有十进制值
如果您需要在Ruby中进行十进制计算,请考虑使用BigDecimal
(documentation):
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.