Python:奇怪的浮点数学结果

时间:2014-08-06 18:09:34

标签: python math while-loop floating-point modulo

number = 9.3

while number % 0.5 != 0:
    number -= 0.1

print number
  
    
      

-20.0

    
  

我预计数字最终将这个while循环保留为9.0,但不知怎的,它已经变成了-20.0。请注意,如果我将数字更改为9.2,它就像我期望的那样工作并变为9.0。有些值的工作原理是9.0,9.7,有些则不是9.4,9.8。我不知道为什么。顺便说一下9.8变成了-1204.5,这更奇怪了。我无法解释这些结果。请原谅我,如果我错过了一些基本的东西,因为我刚开始学习计算机编程。

1 个答案:

答案 0 :(得分:0)

这是因为浮点精度。如果您在循环中打印numbernumber % 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)