Python3中浮点数等式正确编写及精度问题解决方法
Python浮点数等式判断的精度问题解决方法
这是典型的浮点数二进制存储精度误差导致的问题:70/23是一个无限循环的二进制小数,计算机无法用有限位二进制精确表示它,只能存储近似值,后续计算时这个微小误差会被放大,最终得到接近-481但存在极小数尾差的结果。
解决方法有以下几种,可根据场景选择:
- 近似阈值比较(最常用):不要直接判断浮点数是否相等,而是判断两者的差值绝对值是否小于一个极小的阈值(比如1e-9,可根据精度需求调整):
slope = 70 / 23 c = 9 calculated = slope * -161 + c target = -481 # 用阈值判断近似相等 if abs(calculated - target) < 1e-9: print(True) else: print(False)
- 使用decimal模块精确控制精度:适合对数值精度要求极高的场景,通过设置精度来避免近似误差:
from decimal import Decimal, getcontext # 设置足够计算精度的位数 getcontext().prec = 20 slope = Decimal(70) / Decimal(23) c = Decimal(9) calculated = slope * Decimal(-161) + c # 此时计算结果为精确的-481 print(calculated == Decimal(-481)) # 输出 True
- 改用分数运算:用fractions模块以分数形式存储和计算,完全避免浮点数误差:
from fractions import Fraction slope = Fraction(70, 23) c = Fraction(9) calculated = slope * (-161) + c # 计算结果为Fraction(-481, 1),等价于整数-481 print(calculated == -481) # 输出 True
内容的提问来源于stack exchange,提问作者Changnam Hong
相关产品推荐
相关产品推荐

