Python:奇怪的浮点数运算结果

-2 投票
1 回答
1067 浏览
提问于 2025-04-18 16:17
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

这是因为浮点数的精度问题。如果你在循环中打印 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)

撰写回答