浮点数相等一直是个老生常谈的话题。今天我们借助python math模块中的isclose函数说明一下这个问题。
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
Determine whether two floating point numbers are close in value
python官方在文档中给出了如上说明,解释一下参数的含义:
(1)rel_tol :使用科学计数法表示的a, b两数允许的最大差异。例如当rel_tol=1e-02,即表示当a与b两数的差异小于0.1时,即认为是相等的,具体看下面例子。
>>> import math
>>> a = 5.0
>>> b = 4.99
# a - b < 0.1,所以返回true
>>> math.isclose(a, b, rel_tol=1e-2)
True
# |b - a| < 0.1,也是可以的
>>> math.isclose(b, a, rel_tol=1e-2)
True
# |b-a| > 0.01,结果就是false了
>>> math.isclose(b, a, rel_tol=1e-3)
False
(2)abs_tol,该参数表示绝对差,当指定了它之后,还可以实现更为精确的比较。
>>> a=4.953
>>> b=4.951
# 由于a - b >= 0.002,所以结果为false
>>> math.isclose(b, a, abs_tol=0.002)
False
# 由于a - b < 0.003,所以结果为true
>>> math.isclose(b, a, abs_tol=0.003)
True
(3)如果同时指定了上述两个参数,则只要符合一个即可
>>> a=4.953
>>> b=4.951
>>>> math.isclose(b, a,rel_tol=1e-3, abs_tol=0.002)
True
(4)除了浮点数,在整数之间的比较也是非常方便的。
>>> a=1111
>>> b=1120
# 有时在比较比较大的数的时候,
# 个位十位忽略掉都是可以的
>>> math.isclose(b, a,abs_tol=10)
True
>>> math.isclose(b, a,abs_tol=5)
False
哈哈,以上就是python小工具今天的介绍,其实还是实用性很高的一个函数,尤其在大批量数据使用pandas时,优势还是非常明显的。有兴趣的话,可以关注:python小工具。一起学习python和pandas。