我一直在四处寻找在 Python 中比较两个数字的通用方法。特别是,我想弄清楚它们是否相同。
Python 中的数字类型是:
int, long, float & complex
例如,我可以通过简单地说来比较 2 个整数(一种数字):
a == b
对于 float ,由于舍入精度,我们必须更加小心,但我可以在一定公差范围内比较它们。
问题
我们得到 2 个通用数值 a
和 b
:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是 int
,那么它的虚部将是 0)并在该域中进行比较?
这个问题比直接比较 float 更笼统。当然,它与这个问题有关,但又不一样。
在 Python 3.5(和 Numpy)中,您可以使用 isclose
阅读PEP 485描述它的 Python 3.5 数学 library listing和 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 )