在 Python 中比较浮点数时,由于浮点数的精度限制,直接使用 == 来判断两个浮点数是否相等通常是不可靠的。可以通过设置比较精度(容许误差)来判断两个浮点数是否在特定范围内相等。常用的方法如下:

1. 使用内置的 math.isclose() 函数

Python 3.5 引入了 math.isclose() 函数,用于比较两个浮点数是否接近相等。此函数允许设置相对误差和绝对误差,以控制比较精度。

import math

a = 0.1 + 0.2
b = 0.3

# 使用默认精度(相对误差 1e-09)
print(math.isclose(a, b))  # 输出: True

# 设置更高的精度
print(math.isclose(a, b, rel_tol=1e-10, abs_tol=1e-10))
  • rel_tol:相对误差容忍度,默认为 1e-09
  • abs_tol:绝对误差容忍度,默认值为 0.0。适合比较非常小的数时使用。

2. 使用自定义误差范围

如果需要手动设置精度,也可以通过自定义误差范围进行比较。

def is_close(a, b, tol=1e-9):
return abs(a - b) < tol

a = 0.1 + 0.2
b = 0.3
print(is_close(a, b)) # 输出: True

3. 使用 decimal 模块

对于高精度计算,decimal 模块可以更精确地控制小数位数。将浮点数转换为 Decimal 对象后,可以设定精度进行比较。

from decimal import Decimal, getcontext

# 设置精度
getcontext().prec = 10

a = Decimal('0.1') + Decimal('0.2')
b = Decimal('0.3')
print(a == b) # 输出: True

4. 使用 numpy.isclose()(适合科学计算)

numpy.isclose() 是 NumPy 提供的类似 math.isclose() 的函数,适用于比较数组中的浮点数。

import numpy as np

a = 0.1 + 0.2
b = 0.3
print(np.isclose(a, b)) # 输出: True