Python中比较数字的一般方法

Python中比较数字的一般方法,python,floating-point,int,type-conversion,numerics,Python,Floating Point,Int,Type Conversion,Numerics,我一直在寻找比较Python中两个数字的一般方法。特别是,我想弄清楚它们是否相同 Python中的数字类型有: int, long, float & complex 例如,我可以比较2个整数(一种数字),只需说: a == b 对于浮动,由于舍入精度,我们必须更加小心,但我可以在一定公差范围内比较它们 问题 我们得到了两个通用数字a和b:我们如何比较它们?我在考虑将两者都转换为复数(如果类型是,比如,int,那么会有一个0的虚部)并在该域中进行比较 这个问题比直接比较浮动更为普遍。当

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

Python中的数字类型有:

int, long, float & complex
例如,我可以比较2个整数(一种数字),只需说:

a == b
对于浮动,由于舍入精度,我们必须更加小心,但我可以在一定公差范围内比较它们

问题

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


这个问题比直接比较浮动更为普遍。当然,它与这个问题有关,但它并不相同。

为什么不直接使用
==

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

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

如果您想要比较不同类型的数字,那么
=
操作符没有问题: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
abs((10**.5)**2-10)<1e-10 真的 在Python3.5(和Numpy)中,您可以使用
isclose

阅读描述它的文章、Python3.5数学以及更多内容。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)是一样的,答案是一样的:)它甚至对bools有效-
True==1.0
False==0.0
都返回
True
。我想我担心的是宽容,这是怎么起作用的?@denvar我为他们添加了一些东西tolerance@denvar检查是否与公差相比较。我不认为这个答案适用于复数。对于isclose GitHub库+1。正如他们所说的:它们会对精确相等短路,但如果不是严格相等,则会进行更仔细的检查。这就是我的想法(即使是处理复杂类型)。
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 )