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

den*_*var 9 python floating-point int type-conversion numerics

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

Python中的数字类型是:

int, long, float & complex
Run Code Online (Sandbox Code Playgroud)

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

a == b
Run Code Online (Sandbox Code Playgroud)

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

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

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

daw*_*awg 6

在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
Run Code Online (Sandbox Code Playgroud)

可以改变相对和绝对容差.

相对容差可以被认为是+ - 两个值之间的百分比:

>>> isclose(100,98.9, rel_tol=0.02)
True
>>> isclose(100,97.1, rel_tol=0.02)
False
Run Code Online (Sandbox Code Playgroud)

绝对容差是两个值之间的绝对值.它与测试相同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 )
Run Code Online (Sandbox Code Playgroud)


bri*_*pck 5

如果你想比较不同类型的数字,那么==运算符没有错:Python将处理类型转换.考虑以下:

>>> 1 == 1 + 0j == 1.0
True
Run Code Online (Sandbox Code Playgroud)

如果您正在进行可能导致精度损失的数学运算(尤其是使用浮点数),通常的技术是检查值是否在某个容差范围内.例如:

>>> (10**.5)**2
10.000000000000002
>>> (10**.5)**2 == 10
False
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以找到差异的绝对值,并确保它低于某个阈值:

>>> abs((10**.5)**2 - 10) < 1e-10
True
Run Code Online (Sandbox Code Playgroud)