当我运行代码时
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
任何人都可以帮忙解释一下吗?
答案 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的问题: