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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:37:36