在什么情况下 'str(float(val)) == val' 在 Python 中不成立?[复制]

Under what condition will `str(float(val)) == val` NOT hold in Python? [duplicate]

提问人:zyxue 提问时间:11/4/2023 最后编辑:Peter Mortensenzyxue 更新时间:11/5/2023 访问量:76

问:

对于像这样的字符串变量,总是成立吗?val"1.2345"assert str(float(val)) == val

我已经发现它并不总是成立

>>> str(float('1.2345'))
'1.2345'
>>> str(float('0.1231412314124124124124124124'))
'0.12314123141241241'

但理论边界在哪里?我们怎样才能推理出在什么条件下左边和右边的平等是不成立的呢?

Python 浮点 精度

评论

1赞 John Gordon 11/4/2023
从广义上讲,如果你的字符串不能完全表示为浮点数,它就不会成立。请查看 IEEE 浮点规范文档以获得更深入的答案。
3赞 interjay 11/4/2023
"0.00"是一个微不足道的案例,它不成立。
2赞 Frank Yellin 11/4/2023
str(float('5'))是。如上所述,也是. 是。因此,在各种情况下,这都不成立。5.0str(float('5.00'))5.0str(float('.5'))0.5

答:

1赞 DepletedKnowledge 11/4/2023 #1

和之间的区别源于计算机中浮点表示的有限精度。计算机使用二进制分数来存储浮点数,并非所有十进制分数都可以是精确的二进制表示形式,从而导致转换过程中出现较小的舍入误差。str(float(val))val

在 Python 中,浮点数是一个双精度 64 位 IEEE 754 值,提供大约 15 位十进制数字的精度。当十进制字符串中的有效位数超过此精度时(例如,有 25 位有效数字),在将其转换为浮点数并转换回字符串时会发生精度损失。'0.1231412314124124124124124124'

1赞 Frank Yellin 11/4/2023 #2

答案是否定的,这与IEEE或类似的东西无关。即使在无限精度的浮点计算机上(如果存在这样的东西),你也会遇到问题。

想想吧。“5.0”、“5.00”、“5”、“05.0”等在调用时都会返回完全相同的字符串。显然,其中只有一个会返回 x。str(float(x))str(float(x))