CMPF.FLOAT

使用等号运算符 (==) 比较两个浮点值或双精度值时打印的错误。

漏洞与风险

由于浮点计算可能错误,避免对浮点类型进行相等性检查。下面的示例可能导致无限循环,因为由于计算错误,x1 + 700 * ((x2 - x1) / 700) 不等于 x2。

缓解与预防

进行大于或等于、小于或等于,或小于某值的不同绝对值的检查,例如 Math.abs(x1-x2) < MIN_DIFF。

示例 1

复制
      /**
      * Calculates define integral
      */
     public static double integral(MyFunction f, double x1,
                                   double x2) {
         double x = x1;
         double result = 0;
         double step = (x2 - x1) / 700;
         while (x != x2) { // should use (x <= x2)
             result = result + f.valueFor(x) * step;
             x = x + step;
         }
         return result;
     }

针对第 17 行报告 CMPF.FLOAT:应避免对浮点类型进行相等性检查