Pytest 如何断言浮点数近似相等(assertAlmostEqual)?
浮点数断言用 pytest.approx:assert result == pytest.approx(3.14, rel=1e-3)。支持绝对/相对误差、列表与字典。计算可能有舍入误差时应按业务容差比较。本文给出用法与误差参数。
用 pytest.approx:assert result == pytest.approx(3.14159, rel=1e-3)——浮点运算有精度误差,当计算可能引入舍入误差时,应按业务容差比较;可精确表示的结果并非必然比较失败。
基本用法
import pytest
def test_calculation():
result = 0.1 + 0.2
assert result == pytest.approx(0.3) # 默认相对容差 1e-6,绝对容差 1e-12,两者满足其一即可
# 自定义误差
assert value == pytest.approx(3.14, rel=1e-2) # 相对误差 1%
assert value == pytest.approx(3.14, abs=0.01) # 只指定 abs 时仅使用绝对容差 0.01
容器也支持
assert [1.1, 2.2] == pytest.approx([1.1, 2.2])
assert {'pi': 3.14159} == pytest.approx({'pi': 3.14}, rel=1e-3)
import numpy as np
assert np.array([1.0, 2.0]) == pytest.approx(np.array([1.0, 2.0]))
unittest 传统写法
self.assertAlmostEqual(result, 3.14, places=2) # 把两数差值 round 到 2 位后为零,不是分别舍入后比较
self.assertAlmostEqual(result, 3.14, delta=0.01) # 或差值
常见问题(FAQ)
Q:approx 能断言不等吗? 可用 assert x != pytest.approx(y)。
Q:NaN 怎么处理? pytest.approx(float('nan'), nan_ok=True)。