为何少量位数的小数能被正确打印?IEEE 754及Python实现解析
问题解答
先看Python里的典型现象:
>>> 0.1 + 0.2 0.30000000000000004
或是:
>>> 0.10000000000000001 0.1
这种现象是IEEE 754标准特性与Python的浮点数显示机制共同作用的结果,具体拆解如下:
1. IEEE 754的存储本质
计算机用有限长度的二进制位存储浮点数,大部分十进制小数(比如0.1、0.2)无法被二进制浮点数精确表示,实际存储的是它们的近似值。以0.1为例,它的二进制表示是无限循环的,只能被截断到IEEE 754双精度浮点数的位数,所以存储的实际值和字面意义上的0.1存在微小偏差。
2. Python的浮点数显示逻辑
Python在打印浮点数时,不会直接输出存储的精确二进制转换结果,而是遵循一个规则:寻找最短的十进制字符串,当这个字符串被转换回IEEE 754浮点数时,能完全还原到原来的存储值。
- 对于
0.1、0.2这类短十进制小数,虽然存储的是近似值,但存在一个最短的十进制字符串(就是它们本身),转换后能对应到存储的近似值,所以打印时直接显示这个短字符串。 - 而
0.10000000000000001这个字面量,当转换为IEEE 754浮点数时,和0.1的存储值完全一致,所以Python会显示更短的0.1。 - 至于
0.1 + 0.2的结果,它的存储值无法用一个短十进制字符串来还原,所以Python只能输出最接近的精确十进制表示,也就是0.30000000000000004。
内容的提问来源于stack exchange,提问作者Weier
相关产品推荐
相关产品推荐

