Python float - str - float 的奇怪现象

11 投票
4 回答
7932 浏览
提问于 2025-04-15 16:15
>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

这里发生了什么呢?我该如何把 0.47000000000000003 转换成字符串,然后再把这个字符串转换回浮点数呢?

我在Windows上使用的是Python 2.5.4。

4 个回答

2

这是一个关于Python的常见问题解答。

在comp.lang.python这个讨论组里,这个问题也经常被提到。

我觉得这个问题之所以常被问,是因为Python在其他方面都表现得很好,我们自然希望它在数学计算上也能做到完美,就像我们在学校学到的一样。然而,任何上过数值方法课程的人都会告诉你,浮点数的计算远远不完美。

Decimal(十进制)是一个不错的替代方案,如果你需要更快的速度和更多的选项,gmpy也非常好。

3

浮点数(float)和双精度浮点数(double)并不是完全精确的。当你对它们进行运算时,难免会出现一些舍入误差。

16

当你用 str(0.47000000000000003) 这个命令时,它会给你 '0.47' 的结果。而如果你用 float('0.47'),你可能得到的是 0.46999999999999997。这其实是因为计算机处理小数的方式(你可以看看这篇 维基百科 的文章来了解更多)。

需要注意的是,如果你用 float(repr(0.47000000000000003)) 或者 eval(repr(0.47000000000000003)),你会得到你想要的结果。但是如果你需要更精确的小数,建议使用 Decimal 这个工具。

撰写回答