在Python中比较数字的一般方法

时间:2016-10-13 14:54:30

标签: python floating-point int type-conversion numerics

我一直在寻找一种比较Python中两个数字的一​​般方法。特别是,我想弄清楚它们是否相同。

Python中的数字类型是:

int, long, float & complex

例如,我可以通过简单地说:

来比较2个整数(一种数字)
a == b

对于浮点数,由于舍入精度,我们必须更加小心,但我可以在一定容差范围内对它们进行比较。

问题

我们得到2个一般数字ab:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是int,那么它将具有0个虚部)并在该域中进行比较?

这个问题比直接比较浮点数更普遍。当然,它与这个问题有关,但它不一样。

3 个答案:

答案 0 :(得分:6)

在Python 3.5(以及Numpy)中,您可以使用isclose

阅读描述它的PEP 485,Python 3.5数学library listingnumpy.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上有一个版本。

或者,(放弃错误检查以及infNaN支持)您可以使用:

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

我非常确定这适用于所有数字类型。