pytest: 断言近似相等

325 投票
8 回答
157873 浏览
提问于 2025-04-17 08:38

如何在使用 pytest 时对浮点数进行 assert almost equal 的检查,而不需要使用一些复杂的方法:

assert x - 0.00001 <= y <= x + 0.00001

更具体来说,知道一个简单的方法来快速比较一对浮点数,而不需要把它们拆开,会非常有用:

assert (1.32, 2.4) == i_return_tuple_of_two_floats()

8 个回答

41

如果你能使用NumPy这个库,它里面有很棒的功能可以用来比较浮点数,这些功能已经可以进行成对比较,具体可以查看numpy.testing

然后你可以像下面这样做:

numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))
58

你需要先明确什么对你来说是“差不多”的意思:

assert abs(x-y) < 0.0001

这适用于元组(或者任何序列):

def almost_equal(x,y,threshold=0.0001):
  return abs(x-y) < threshold

assert all(map(almost_equal, zip((1.32, 2.4), i_return_tuple_of_two_floats())

更新:
pytest.approx 是在2016年作为 pytest v3.0.0 的一部分发布的。
这个回答是在它之前的,如果你:

  • 没有更新版本的 pytest 并且
  • 你理解浮点数精度及其对你使用场景的影响。

在几乎所有常见的场景中,建议使用 pytest.approx,就像在 这个 回答中提到的那样。

515

我注意到这个问题特别提到了pytest。pytest 3.0版本里有一个叫做 approx() 函数(其实是一个类),这个功能在这种情况下非常有用。

import pytest

assert 2.2 == pytest.approx(2.3)
# fails, default is ± 2.3e-06
assert 2.2 == pytest.approx(2.3, 0.1)
# passes

# also works the other way, in case you were worried:
assert pytest.approx(2.3, 0.1) == 2.2
# passes

撰写回答