对于像
val
这样的字符串 "1.2345"
变量,assert str(float(val)) == val
总是成立吗?
我已经发现它并不总是成立
>>> str(float('1.2345'))
'1.2345'
>>> str(float('0.1231412314124124124124124124'))
'0.12314123141241241'
但是理论边界在哪里,如何推理在什么条件下左右边相等不成立?
str(float(val))
和val
之间的差异源于计算机中浮点表示的有限精度。计算机使用二进制分数来存储浮点数,并且并非所有十进制分数都可以是精确的二进制表示,从而导致转换过程中出现较小的舍入误差。
在 Python 中,浮点数是双精度 64 位 IEEE 754 值,提供大约 15 位十进制数字的精度。当十进制字符串中的有效数字位数超过此精度时(例如,
'0.1231412314124124124124124124'
有 25 个有效数字),将其转换为浮点型再转换回字符串时会出现精度损失。