You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Pandas与Python的round函数舍入结果存在差异?

Pandas与Python舍入行为差异解析

笔者发现Pandas与Python在执行舍入操作时存在行为差异,具体测试代码及结果如下:

>>> import pandas as pd
>>> numbers = [0.495,1.495,2.495,3.495,4.495,5.495,6.495, 7.495,8.495, 9.495, 10.495]
>>> [round(float(x),2 ) for x in numbers]
[0.49, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.49, 9.49, 10.49]
>>> pd.DataFrame(numbers).astype(float).round(2)
        0
0    0.50
1    1.50
2    2.50
3    3.50
4    4.50
5    5.50
6    6.50
7    7.50
8    8.49
9    9.49
10  10.50

问题

为何Pandas对0.495和10.495的舍入结果与Python不同?原以为Python 3后二者均实现了银行家舍入,哪一种实现更准确?

解析

差异核心原因

  • 浮点数二进制存储精度限制:0.495、10.495这类十进制小数无法被二进制浮点数精确存储,实际内存中是它们的近似值。
  • 底层实现逻辑不同:Python的round()直接基于浮点数的实际存储值计算;而Pandas的round()依赖NumPy的舍入逻辑,对这些近似值的判定规则更偏向常规“四舍五入”,导致部分数值结果不同。

关于银行家舍入

Python 3的round()确实实现了银行家舍入(四舍六入五成双),但仅针对能精确表示的浮点数。对于无法精确存储的数值,实际判断的是存储的近似值是否满足“五成双”条件。而Pandas的处理逻辑在这类场景下未严格遵循银行家舍入,导致结果偏差。

准确性对比

不存在绝对的“更准确”,二者差异源于处理逻辑的不同:

  • 若追求统计无偏性的银行家舍入规则,Python的实现更贴合;
  • 若期望符合日常直觉的“四舍五入”结果,Pandas的实现更符合认知。

两种实现均基于浮点数实际存储值计算,无对错之分,需根据业务场景选择合适的方式。


内容的提问来源于stack exchange,提问作者asmaier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:42:33