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

为何Python sum()与Pandas sum()对浮点数求和结果不同?

浮点数求和:Python sum()与Pandas sum()的差异解析

问题现象

对同一组浮点数列表求和时,Python内置sum()与Pandas的sum()结果存在细微浮点误差,导致四舍五入后结果不同;且反转列表后,Pythonsum()结果不变,但Pandassum()结果发生变化:

正序列表求和示例

>>> import pandas as pd
>>> from decimal import Decimal
>>> numbers = [0.495,1.495,2.495,3.495,4.495,5.495,6.495, 7.495,8.495, 9.495, 10.495]
>>> Decimal(sum(numbers))
Decimal('60.44500000000000028421709430404007434844970703125')
>>> round(Decimal(sum(numbers)),2)
Decimal('60.45')
>>> Decimal(float(pd.DataFrame(numbers).sum()))
Decimal('60.44499999999999317878973670303821563720703125')
>>> round(Decimal(float(pd.DataFrame(numbers).sum())),2)
Decimal('60.44')

反转列表求和示例

>>> Decimal(sum(reversed(numbers)))
Decimal('60.44500000000000028421709430404007434844970703125')  # 与原列表结果一致
>>> Decimal(float(pd.DataFrame(reversed(numbers)).sum()))
Decimal('60.44499999999998607336237910203635692596435546875')  # 与原列表结果不同

原因解析

1. 两者求和结果不同的核心原因

  • Python内置sum()采用顺序累加:从初始值0开始,逐个将列表元素加到当前总和中,每一步的舍入误差会逐步累积。
  • Pandas的sum()为了提升计算效率,默认使用更优化的累加算法(比如成对累加或利用硬件的SIMD指令并行计算)。这类算法会改变元素的累加顺序和分组方式,不同的中间步骤舍入操作会产生与顺序累加不同的误差结果。

2. Pandas反转列表后结果变化的原因

浮点加法在数学上满足交换律,但有限精度的浮点运算不满足交换律:不同的累加顺序会导致中间结果的精度损失路径不同,最终的误差累积结果也就不一样。

  • Python的sum()无论是正序还是逆序,都是线性遍历累加,对于这组特定数据,正序和逆序的误差累积恰好抵消,结果一致;
  • Pandas使用的优化累加算法(比如成对累加)会根据元素的顺序分组计算,反转列表后分组方式改变,中间步骤的舍入误差随之变化,最终总和出现差异。

3. 这是Bug吗?与硬件有关吗?

这不是Bug,是浮点运算的固有特性,同时也是Pandas为了性能选择优化算法的结果。硬件(比如Apple M3 Pro的ARM架构SIMD指令)会影响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.24 17:37:11