如何在Python3中解决浮点数列表求和的精度误差问题?
解决Python浮点数精度误差问题
当然可以用Python标准库本身解决这个问题,根源在于二进制浮点数无法精确表示十进制的0.35:单个0.35存储时已是近似值,乘法是单次近似后运算,求和则是多次近似值累加,误差累积导致结果差异。以下是几种内置方案:
1. 使用decimal模块(精确控制小数精度)
decimal模块允许以十进制精确表示小数,可指定精度避免二进制浮点数的误差:
from decimal import Decimal, getcontext # 设置足够的精度 getcontext().prec = 20 # 用Decimal精确表示0.35 num = Decimal('0.35') print(num * 10) # 输出 Decimal('3.5') print(sum([num]*10)) # 输出 Decimal('3.5') # 按需转成普通浮点数或字符串 print(float(num * 10)) # 3.5
2. 使用fractions模块(以分数形式精确计算)
fractions模块将小数转换为分数,基于整数运算完全避免浮点数误差:
from fractions import Fraction num = Fraction('0.35') # 自动转换为7/20 print(num * 10) # 输出 Fraction(7, 2),对应3.5 print(sum([num]*10)) # 输出 Fraction(7, 2) # 按需转成浮点数 print(float(num * 10)) # 3.5
3. 合理四舍五入(快速统一结果)
如果仅需结果一致、不需要绝对精确,可对求和结果进行四舍五入,保留合适小数位数:
a = [0.35 for i in range(10)] sum_result = round(sum(a), 2) print(sum_result) # 3.5 print(sum_result == 0.35*10) # True
内容的提问来源于stack exchange,提问作者Raiyan
相关产品推荐
相关产品推荐

