这个问题已经有了答案:
What is the best way to compare floats for almost-equality in Python?
14个答案
我一直在寻找一种比较Python中两个数字的一般方法。特别是,我想弄清楚它们是否相同。
python中的数字类型有:
int, long, float & complex
例如,我可以通过简单地说:
a == b
对于浮点数,由于舍入精度的原因,我们必须更加小心,但是我可以在一些公差范围内比较它们。
问题
我们得到2个一般的数字,我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是,比如,
a
,那么它将有一个0的虚部)并在该域中进行比较?这个问题比直接比较浮点更普遍。当然,它与这个问题有关,但它并不相同。
最佳答案
在python 3.5(和numpy)中,可以使用isclose
阅读描述它的PEP 485,python 3.5 mathlibrary listing和numpy.isclose了解更多信息。numpy版本适用于支持numpy的所有python版本。
示例:
>>> from math import isclose
>>> isclose(1,1.00000000001)
True
>>> isclose(1,1.00001)
False
相对公差和绝对公差可以改变。
相对公差可被认为是两个值之间的+-百分比:
>>> isclose(100,98.9, rel_tol=0.02)
True
>>> isclose(100,97.1, rel_tol=0.02)
False
绝对公差是两个值之间的绝对值。与
abs(a-b)<=tolerance
python 3.5版本支持所有数字类型的python。(使用复杂的
cmath
版本)我认为从长远来看,这是你在算术上最好的选择。对于旧的python,只需导入源代码。Github上有一个版本。
或者,(放弃错误检查和
inf
和NaN
支持)您可以只使用:def myisclose(a, b, *, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )