浮点迭代的ruby问题

时间:2015-05-03 00:26:58

标签: ruby floating-point

当我运行代码时

count = 0

while count < 1
  count += 0.1
  puts count
end

我希望

0.1 
0.2 
0.3 
. . . 

然而,我一直在

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999

任何人都可以帮忙解释一下吗?

3 个答案:

答案 0 :(得分:1)

这样想:

您的计算机只有32或64位来表示数字。这意味着它只能代表有限数量的数字。

现在考虑介于0和1之间的所有小数值。它们的数量无限。如果你的机器甚至不能代表0和1之间的所有数字,你怎么可能代表所有的实数?

答案是您的机器需要近似十进制数。这就是你所看到的。

当然there are libraries that try to overcome these limitations并且使它仍然可以准确地表示十进制数字。一个这样的库是BigDecimal:

require 'bigdecimal'

count = BigDecimal.new("0")
while count < 1
  count += 0.1
  puts count.to_s('F')
end

失败的原因是这些库的算术速度通常较慢,因为它们是CPU上方的软件层,可以进行这些计算。

答案 1 :(得分:0)

浮点数不能精确地表示所有实数,并且浮点运算不能精确地表示真正的算术运算,这会导致许多令人惊讶的情况。

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

您可能希望使用BigDecimal来避免此类问题。

答案 2 :(得分:0)

这是在内存中表示浮点数的众多结果之一!

要解释究竟发生了什么事情会很长,而其他人之前已经做得更好了,对你来说最好的事情就是阅读有关其他地方的内容:

您还可以查看以前关于SO的问题: