软件:python3

之前写算法的时候遇到个非常细小但是致命的错误,当时使用异常检测算法,遇到了检测出的异常非常离谱。整个算法似乎不生效。后来debug一点一点排查原因,发现了原来算法逻辑中有对浮点数进行相等判断,当时直接使用了 “==”。这个地方出了大问题。

对于浮点数的判断,计算机中对于浮点数无法在数学上进行解析完全相等。计算机只能尽可能的数值模拟一个值。即使对于类似于3.0这样的在我们看来是一个整数的值,对于计算机来说,他可能内部表达为3.000000000001。因此对于3 和 3.000000000001进行 “==” 判断,返回的一定是false。

因此对于python的浮点数判断,只能使用近似。这就需要使用到 math.isclose() 函数


math.isclose(a,b,abs_tol,rel_tol)

  • a:必要, 检查紧密度的第一个值
  • b:必要, 检查紧密度的第二个值
  • rel_tol: 可选。 相对公差。 它是值a和b之间的最大允许差。 默认值为1e-09
  • abs_tol: 可选。最小绝对公差。它用于比较接近0的值。该值必须至少为0
>>> import math
>>> math.isclose(0.001,0,abs_tol=0.1)
True
>>> math.isclose(0.001,0,abs_tol=0.001)
True
>>> math.isclose(0.001,0,abs_tol=0.0001)
False
>>> math.isclose(8.00001,7.99999,rel_tol=0.0001)
True
>>> math.isclose(8.00001,7.99999,rel_tol=0.00001)
True
>>> math.isclose(8.00001,7.99999,rel_tol=0.000001)
False

一般来说,我使用rel_tol来判断两个浮点数是否接近。使用abs_tol 判断一个浮点数与0是否接近。