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

Python sum()对不同排序的相同列表求和出现舍入误差,如何修正?

浮点数求和顺序差异问题解决方法

该问题本质是二进制浮点数存储精度限制导致的累加顺序敏感:Python内置sum()函数按列表顺序逐次累加,不同累加顺序会产生不同的累积精度误差,和Python版本本身无关,仅因版本迁移后列表排序变化改变了累加顺序触发了差异。

解决方案

  • 方案1:使用math.fsum()替代内置sum()
    math模块的fsum函数会对浮点数求和过程做精度优化,不受累加顺序影响,可得到更准确的计算结果。
    代码示例:
import math
nums = sorted([0.16666666666666666, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.16666666666666666, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333])
print(math.fsum(nums)) # 输出 1.0
  • 方案2:使用decimal模块做精确十进制运算
    适用于对精度要求极高的场景(如金融计算),通过十进制运算避免二进制浮点数的精度损失。
    代码示例:
from decimal import Decimal
nums = sorted([0.16666666666666666, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.16666666666666666, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333])
decimal_nums = [Decimal(str(x)) for x in nums]
res = sum(decimal_nums)
print(float(res)) # 输出 1.0
  • 方案3:对结果做精度截断处理
    如果业务场景允许微小误差,可以对求和结果做近似处理,忽略1e-10量级的精度差异。
    代码示例:
nums = sorted([0.16666666666666666, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.16666666666666666, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333])
res = sum(nums)
fixed_res = round(res, 10)
print(fixed_res) # 输出 1.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:27:02