2016-10-13 65 views
9

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

数值类型在Python是:

int, long, float & complex 

例如,我可以简单地说,比较两个整数(一个数值型):

a == b 

对于花车,我们必须要由于舍入精度更加小心,但我可以在一定的容差范围内比较它们。

问题

我们得到2个一般NUMERICS ab:我们如何比较呢?我正在考虑将两者都复制到复杂(如果类型为int,那么它将具有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) 
+0

对于那个isclose GitHub库+1。正如他们所说的:他们为了确切的平等而短路,但如果不是严格的平等,那么就会进行更仔细的检查。这正是我所想的(即使处理复杂的类型)。 – denvar

4

为什么不只是使用==

>>1 == (1+0j) 
True 
>>1.0 == 1 
True 

我敢肯定,这适用于所有数字类型。

+1

哈哈,相同的答案:) – brianpck

+1

它甚至适用于布尔变量 - '真== 1.0'和'假= = 0.0'都返回'True'。 –

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 
+0

我想我的关注与容忍产生,这是如何工作的? – denvar

+1

@denvar我加了一些容忍 – brianpck

+1

@denvar检查http://stackoverflow.com/questions/5595425/what-is-the-best-way-to-compare-floats-for-almost-equality-in-python/ 33024979#33024979与宽容比较。我不认为这个答案适用于复杂的数字。 –

相关问题