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

标签 python floating-point int type-conversion numerics

<分区>

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

Python 中的数字类型是:

int, long, float & complex

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

a == b

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

问题

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

这个问题比直接比较 float 更笼统。当然,它与这个问题有关,但又不一样。

最佳答案

在 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 3.5 版本支持所有 Python 数字类型。 (使用 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 )

关于python - 在 Python 中比较数字的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024442/

相关文章:

c - 在 C 中捕获浮点溢出

c - 确定 sprintf 缓冲区大小 - 标准是什么?

python - Python 中二维凸包的周长

python - 属性错误: 'function' object has no attribute <Variable>

java - 在java中将浮点位解释为long?

c# - Float epsilon 在 C++ 中不同于 C#

c++ - 如何使用标准库函数通过错误检查将字符串 (char*) 转换为数字?

C:统计一个int型数组的实际大小

Python 多进程共享内存与使用参数

python - Popen 给出 "File not found"错误 (windows/python)