在Python中,比较浮点数近似相等的最佳方法是什么?

536 投票
18 回答
448124 浏览
提问于 2025-04-16 15:20

大家都知道,比较浮点数是否相等有点麻烦,因为会涉及到四舍五入和精度的问题。

举个例子:比较浮点数,2012年版

在Python中,处理这个问题的推荐方法是什么呢?

有没有什么标准库函数可以用来解决这个问题呢?

18 个回答

75

我同意Gareth的回答可能是最合适的,因为它提供了一个轻量级的函数/解决方案。

不过,我觉得提一下,如果你正在使用NumPy或者在考虑使用它的话,其实有一个现成的函数可以用来解决这个问题。

numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

不过要注意一点:安装NumPy可能会根据你使用的平台而变得有点复杂。

112

像下面这样简单的代码可能就足够用了:

return abs(f1 - f2) <= allowed_error
522

Python 3.5 新增了 math.isclosecmath.isclose 函数,具体内容可以查看 PEP 485

如果你使用的是更早版本的 Python,可以在 文档 中找到类似的功能。

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

rel_tol 是相对容差,它会乘以两个参数中较大的那个数的绝对值;也就是说,当数值变大时,它们之间允许的差距也会变大,但仍然会被认为是相等的。

abs_tol 是绝对容差,它在所有情况下都是直接使用的。如果两个值之间的差距小于这两个容差中的任何一个,那么这两个值就会被认为是相等的。

撰写回答