Python:奇怪的浮点数运算结果
number = 9.3 while number % 0.5 != 0: number -= 0.1 print number
-20.0
我本以为这个数字在离开这个循环的时候会变成9.0,但结果却变成了-20.0。值得注意的是,如果我把数字改成9.2,它就会像我预期的那样变成9.0。有些值像9.0和9.7可以正常工作,而像9.4和9.8的值却不行。我完全不知道为什么。顺便提一下,9.8变成了-1204.5,这更奇怪了。我无法解释这些结果。如果我漏掉了什么基本的知识,请原谅我,因为我刚开始学习计算机编程。
1 个回答
0
这是因为浮点数的精度问题。如果你在循环中打印 number
和 number % 0.5
,你会看到类似这样的结果:
9.2 0.2
9.1 0.1
9.0 1.7763568394e-15 # Not equal to 0!
8.9 0.4
8.8 0.3
8.7 0.2
8.6 0.1
8.5 3.5527136788e-15 # Still different from 0!
...
当 number
达到 -20 时,结果是准确的:
-20.0 0.0
你应该做的是,不要直接检查结果是否等于 0,而是检查结果是否 足够小:
EPSILON = 0.0001
number = 9.3
while number % 0.5 > EPSILON:
number -= 0.1
print number
这样结果会是 9.0
。
但是如果你想要一个 更简洁 的解决方案,不用循环,这个方法总是有效的:
import math
number = 0.5 * math.floor(2.0 * number)