如何断言几乎等于pytest for floats,而不诉诸于类似的东西:
assert x - 0.00001 <= y <= x + 0.00001
更具体地说,它将有助于了解一个整洁的解决方案,快速比较浮点数对,而不拆封它们:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
如何断言几乎等于pytest for floats,而不诉诸于类似的东西:
assert x - 0.00001 <= y <= x + 0.00001
更具体地说,它将有助于了解一个整洁的解决方案,快速比较浮点数对,而不拆封它们:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
当前回答
如果你想要一些不仅适用于浮点数还适用于小数的东西,你可以使用python的math.isclose():
# - rel_tol=0.01` is 1% difference tolerance.
assert math.isclose(actual_value, expected_value, rel_tol=0.01)
其他回答
如果你可以访问NumPy,它有很棒的浮点比较函数,已经与NumPy .testing进行了成对比较。
然后你可以这样做:
numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))
类似的
assert round(x-y, 5) == 0
这就是unittest所做的
第二部分
assert all(round(x-y, 5) == 0 for x,y in zip((1.32, 2.4), i_return_tuple_of_two_floats()))
也许更好的方法是把它封装在一个函数中
def tuples_of_floats_are_almost_equal(X, Y):
return all(round(x-y, 5) == 0 for x,y in zip(X, Y))
assert tuples_of_floats_are_almost_equal((1.32, 2.4), i_return_tuple_of_two_floats())
如果你想要一些不仅适用于浮点数还适用于小数的东西,你可以使用python的math.isclose():
# - rel_tol=0.01` is 1% difference tolerance.
assert math.isclose(actual_value, expected_value, rel_tol=0.01)
可以直接使用round()
a, b = i_return_tuple_of_two_floats()
assert (1.32, 2.4) == round(a,2), round(b,1)
你必须详细说明什么对你来说是“几乎”:
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 AND 你了解浮点精度和它对你的用例的影响。
对于几乎所有常见场景,使用 pytest。大约是这个答案中所建议的。