我一直在寻找一种比较Python中两个数字的一般方法。特别是,我想弄清楚它们是否相同。
Python中的数字类型是:
int, long, float & complex
例如,我可以通过简单地说:
来比较2个整数(一种数字)a == b
对于浮点数,由于舍入精度,我们必须更加小心,但我可以在一定容差范围内对它们进行比较。
问题
我们得到2个一般数字a
和b
:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是int
,那么它将具有0个虚部)并在该域中进行比较?
这个问题比直接比较浮点数更普遍。当然,它与这个问题有关,但它不一样。
答案 0 :(得分:6)
在Python 3.5(以及Numpy)中,您可以使用isclose
阅读描述它的PEP 485,Python 3.5数学library 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都支持Python 3.5版本。 (使用复杂的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 )
答案 1 :(得分:5)
如果您希望比较不同类型的数字,==
运算符没有任何问题:Python将处理类型转换。请考虑以下事项:
>>> 1 == 1 + 0j == 1.0
True
如果您正在进行可能导致精度损失的数学运算(尤其是使用浮点数),通常的技术是检查值是否在某个容差范围内。例如:
>>> (10**.5)**2
10.000000000000002
>>> (10**.5)**2 == 10
False
在这种情况下,您可以找到差异的绝对值,并确保它低于某个阈值:
>>> abs((10**.5)**2 - 10) < 1e-10
True
答案 2 :(得分:4)
为什么不使用==
?
>>1 == (1+0j)
True
>>1.0 == 1
True
我非常确定这适用于所有数字类型。