如何修复Python中小数相加出现的精度误差问题?
Python浮点数精度误差(0.1+0.2≠0.3)解决方案
该问题不是Python的语言bug,是IEEE 754二进制浮点数标准的通用特性:绝大多数十进制有限小数无法用二进制浮点数精确表示,所以运行
0.1 + 0.2时会返回0.30000000000000004这类不符合预期的结果,所有支持IEEE 754标准的编程语言都存在该问题。
可行解决方案
- 方案1:使用标准库
decimal做十进制精确计算(推荐用于金融、会计等高精度要求场景)
注意初始化Decimal时必须传入字符串格式的数值,避免传入本身就有精度损失的浮点数:from decimal import Decimal res = Decimal('0.1') + Decimal('0.2') print(res) # 输出 0.3 # 也可以自定义全局精度 from decimal import getcontext getcontext().prec = 2 # 设置全局保留2位有效数字 - 方案2:使用
round()函数截断精度(适合对精度要求不高的日常运算场景)
对运算结果按需求保留指定小数位即可:res = round(0.1 + 0.2, 1) print(res) # 输出 0.3 - 方案3:使用
fractions模块做分数运算(适合需要完全精确的分数类运算场景)
把小数转成分数运算,完全避免精度损失:from fractions import Fraction res = Fraction('0.1') + Fraction('0.2') print(float(res)) # 输出 0.3 - 方案4:放大数值为整数运算(适合固定精度的业务场景,比如金额计算)
比如金额计算时统一转为分(整数)运算,结束后再转回元:a = int(0.1 * 100) # 10分 b = int(0.2 * 100) # 20分 res = (a + b) / 100 print(res) # 输出 0.3
额外注意事项
不要直接用==判断两个浮点数是否相等,建议用差值小于可接受阈值的方式判断:
a = 0.1 + 0.2 b = 0.3 print(abs(a - b) < 1e-9) # 输出True,判断为相等
内容的提问来源于stack exchange,提问作者Stqrosta
相关产品推荐
相关产品推荐

