9

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

Python 中的数值类型有:

int, long, float & complex

例如,我可以通过简单地说来比较 2 个整数(一种数字):

a == b

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

问题

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

这个问题比简单地直接比较浮点数更笼统。当然和这个问题有关,但又不一样。

4

3 回答 3

7

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

阅读描述它的PEP 485、Python 3.5 数学库列表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 )
于 2016-10-13T15:15:11.550 回答
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
于 2016-10-13T15:00:21.510 回答
4

为什么不直接使用==

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

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

于 2016-10-13T15:00:12.883 回答