pytest: 断言近似相等
如何在使用 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