java - 检查 double 是否相等和 Sonar 问题

标签 java double sonarqube equality

我们正在使用 Sonar 检查代码的质量,Sonar 找到了比较 float 或 double 与常量值是否相等的代码,如下所示:

if (x == 0.0) { … }

变量与 (0.0) 比较的值是常量,如果变量可以等于该值,则该值也不会被计算,而只能通过常量设置。这通常用于检查变量是否尚未设置或仍处于初始化状态,例如。 G。 -1.0在值只能为正的情况下可能用于“尚未设置”。

因此,由于这些值从未计算,而只是从常量设置,因此 Sonar 投诉对我们没有用。只有对于计算值(或不能精确表示为 float 或 double 值的断裂值),对相等性测试的提示才有意义。

我现在的问题是:更改代码以使 Sonar 不再提示此问题的最佳做法是什么?

我看到几个选项:

  1. 将“test-for-unset”提取到一个特殊的测试函数中;但这只会减少出现次数(减少到 1 次),而不是一般问题。
  2. 用特殊的装饰器标记 Sonar 忽略它的代码。但我们希望避免使用此类装饰器。
  3. 隐藏某事背后的比较,如(0.0 <= x && x <= 0.0)!(x != 0.0) (目前看来 Sonar 没问题)。
  4. 调用 Double.doubleToRawLongBits()像这样比较值的位:(Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(0.0)) .
  5. 其他想法?

这些解决方案中没有一个是我真正喜欢的,我认为也许有我想不到的更好的解决方案。

最佳答案

我会选择你的第二个选项:

Mark the code for Sonar to ignore it with a special decorator.

不要成为静态代码分析工具的奴隶。他们并不完美,让他们闭嘴也没什么错。在使用像 @SuppressLint 这样的注释时,我个人的做法是包含一条注释来解释我为什么要使用它。

也就是说,我会创建一个常量,这样代码就更加不言自明了:

private static final double UNINITIALIZED = 0.0;
if (x == UNINITIALIZED) { … }

关于java - 检查 double 是否相等和 Sonar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942032/

相关文章:

java - 使用 PowerMockito 测试方法时跳过 super 调用

java - Sonar 构建失败并出现 NullPointerException

Sonarqube 在运行 sonar-scanner 时出现 node.js 错误

java - ImageView 随着 firebase 适配器不断变化

java - 您什么时候在 Objectify for GAE 中注册类(class)?

java - 如何在多实例 Tomcat 环境中以固定间隔运行任务?

c# - 使用 double.Parse 如果 Null 值,则值替换为 0

java - 如何在showMessageDialog中打印双二维数组?

arrays - 比较两个 Double Swift 4 数组

sonarqube - 如何查看过去特定日期的 sonarqube 时间机器报告