软件: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 |
一般来说,我使用rel_tol
来判断两个浮点数是否接近。使用abs_tol
判断一个浮点数与0是否接近。