Python浮点数二进制疑问:舍入后值显示不同但二进制相同?
浮点数显示与相等性问题的本质
1. 先澄清一个误解
如果两个浮点数的IEEE754二进制存储完全相同,那它们的相等性判断结果必然一致,显示出来的内容也会一致(除非手动指定不同的格式化规则)。你描述的“存储相同但显示、相等性判断不同”大概率是混淆了显示值和实际存储值。
2. 为什么显示值会不一样?
Python打印浮点数时,会自动输出能还原回原二进制值的最短十进制字符串:
- 当你直接写
0.7或者用round(xxx,2)得到这个值时,Python会优先用0.7这个最短字符串展示,因为它足够精确——把0.7转成float后,得到的就是这个二进制值。 - 但如果这个值是通过计算(比如
0.1+0.6)得到的,Python会输出计算过程中产生的更长字符串(0.7000000000000001),但这个字符串对应的二进制值,其实和0.7的存储值不是同一个。你可以用format(interest, '.20f')和format(0.7, '.20f')查看高精度表示,会看到明显差异:前者是0.70000000000000011102,后者是0.69999999999999995559。
3. 为什么相等性判断结果不同?
拿你提到的场景举例:
interest = 0.1 + 0.6得到的是0.7000000000000001对应的二进制值,和0.7字面量的存储值不一样,所以interest == 0.7返回False。round(interest, 2)会把interest四舍五入到最接近的两位十进制小数对应的二进制浮点数,这个值刚好就是0.7字面量的存储值,所以roundInterest == 0.7返回True。
4. 核心原因
所有这些现象的根源都是:十进制分数(比如0.7)无法精确表示为二进制浮点数,只能用近似值存储。Python的显示规则和round()函数的逻辑,只是让这些近似值在不同场景下呈现出不同的表现。
内容的提问来源于stack exchange,提问作者bigbburrows
相关产品推荐
相关产品推荐

