Python math.isclose():只考虑小数位数

Python math.isclose():只考虑小数位数,python,math,pytest,Python,Math,Pytest,根据我阅读and for的理解,在检查两个浮点是否几乎相等时,只应考虑浮点的小数位数。但显然,所有数字也被考虑在内: In [32]: math.isclose(48483.92, 48483.93, rel_tol=1e-06) Out[32]: True In [33]: math.isclose(48483.92, 48483.93, rel_tol=1e-07) Out[33]: False In [36]: math.isclose(484.92, 484.93, rel_tol=

根据我阅读and for的理解,在检查两个浮点是否几乎相等时,只应考虑浮点的小数位数。但显然,所有数字也被考虑在内:

In [32]: math.isclose(48483.92, 48483.93, rel_tol=1e-06)
Out[32]: True

In [33]: math.isclose(48483.92, 48483.93, rel_tol=1e-07)
Out[33]: False

In [36]: math.isclose(484.92, 484.93, rel_tol=1e-04)
Out[36]: True

In [37]: math.isclose(484.92, 484.93, rel_tol=1e-05)
Out[37]: False

In [38]: 48483.92 == pytest.approx(48483.93, rel=1e-6)
Out[38]: True

由于我不知道我的程序中的整数有多大,是否有一个函数可以检查两个浮点数是否几乎相等,如果我将公差设置为1e-6,但仅设置为1e-2,则48483.92不等于48483.93?

您可以根据需要设置两个可选的公差参数:

math.isclose(48483.92, 48483.93,rel_tol=0, abs_tol=1e-1)
因为浮点问题

math.isclose(48483.92, 48483.93,rel_tol=0, abs_tol=1e-2)
计算结果为false,因此您应该为小数点后2位提供一点缓冲,可能是
abs\u tol=0.5e-1


虽然这样做是可能的,但通常是不可取的。
math.isclose()
的默认值是测试相对误差而不是绝对误差,这是有原因的。绝对误差更难解释,因为它的重要性取决于数字的比例。

如果我理解正确(例如,
abs\u tol=1e-2
,如果您只对小数点后的前两位感兴趣),看起来您想设置绝对公差(
abs\u tol
)而不是相对公差。@beanbremen Ouch先生,从医生那里我看不太清楚!至少不是从pytest文档(我开始阅读的地方)中。谢谢