为何Jupyter与Python控制台的浮点值显示存在差异?
为什么Jupyter与Python控制台的浮点输出存在差异?
先还原你遇到的场景:
在Jupyter 4.3.1(Python 2.7.13)中执行这段代码:
import numpy as np for i in np.arange(5, 6, 0.1): print(i)
得到的输出是:
5.0 5.1 5.199999999999999 5.299999999999999 5.399999999999999 5.499999999999998 5.599999999999998 5.6999999999999975 5.799999999999997 5.899999999999997
但在Python原生控制台执行相同代码时,输出却是:
5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9
核心原因拆解
这本质是浮点数存储精度限制加上不同环境的显示规则差异导致的:
首先,十进制的
0.1无法用二进制浮点数精确表示——它是一个无限循环的二进制小数,所以np.arange生成序列时,每一步都是在前一个数的基础上累加这个不精确的0.1近似值,误差会逐步累积,导致后面的数值和你预期的十进制值存在微小偏差。两个环境的显示规则不同:
- Python原生控制台(Python 2.7)在打印浮点数时,会自动采用「最短十进制表示」策略——它会找到能还原为原始二进制浮点数的最短十进制字符串,所以你看到的是整齐的
5.2、5.3,而非实际存储的近似值。 - Jupyter(或numpy的输出逻辑)则更偏向于展示浮点数的实际存储细节,用了更高精度的格式化方式,所以那些累积的微小误差就直接暴露了出来。
- Python原生控制台(Python 2.7)在打印浮点数时,会自动采用「最短十进制表示」策略——它会找到能还原为原始二进制浮点数的最短十进制字符串,所以你看到的是整齐的
验证小技巧
你可以在两个环境中对同一个数值执行repr(i),比如取序列中那个显示为5.199999999999999的元素,会发现两个环境返回的repr结果完全一致——这说明两个环境中存储的浮点数本身是相同的,只是显示时的格式化逻辑不一样。
内容的提问来源于stack exchange,提问作者com
相关产品推荐
相关产品推荐

