Python浮点算术比较结果不符合预期的问题咨询
问题原因与解决方法
为什么比较结果为False?
Python中的普通浮点数(如0.1、1.1)遵循IEEE 754二进制浮点数标准,很多十进制小数无法被二进制精确表示,存储时只能保留近似值。例如:
0.1在二进制中是无限循环的小数,实际存储的值是0.10000000000000000555...1.1同理,存储的是近似值,因此abs(x2 - x1)的结果并非精确的0.1,再乘以0.1后,得到的是接近0.01但存在微小误差的值,直接用==比较自然返回False。
你尝试用Decimal但仍失败,是因为你用Decimal(0.1)初始化时,传入的0.1已经是带误差的浮点数,Decimal会保留这个误差,而非精确的十进制0.1,最终计算结果和0.01(浮点数)比较仍不相等。
正确的比较方式
1. 全程用Decimal且以字符串初始化
用字符串传入Decimal,避免浮点数的精度污染,确保数值是精确的十进制表示:
from decimal import Decimal, getcontext getcontext().prec = 10 x1 = Decimal('1.1') x2 = Decimal('1.0') result = Decimal('0.1') * abs(x2 - x1) print(result == Decimal('0.01')) # 输出True
2. 浮点数容差比较
对于普通浮点数,不要直接用==,而是判断两个数的差的绝对值是否小于一个极小的阈值(比如1e-9),忽略微小的精度误差:
x1 = 1.1 x2 = 1.0 calculated = 0.1 * abs(x2 - x1) print(abs(calculated - 0.01) < 1e-9) # 输出True
3. 用fractions模块精确表示分数
将小数转换为分数进行计算,完全避免浮点数精度问题:
from fractions import Fraction x1 = Fraction('1.1') x2 = Fraction('1.0') calculated = Fraction('0.1') * abs(x2 - x1) print(calculated == Fraction('0.01')) # 输出True
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

