检查双精度的相等性和声纳问题
我们正在使用Sonar检查代码的质量,Sonar找到了代码,该代码将浮点数或双精度的相等性与常量值进行比较,如下所示:
if (x == 0.0) { … }
与变量()进行比较的值是常量,如果变量可以等于此值,则该值也不会计算,而只能通过常量设置。这通常用于检查变量是否尚未设置或仍处于初始化状态,例如 可用于“尚未设置”,如果值只能为正数。0.0
-1.0
因此,由于这些值从未计算过,而只是从常量设置,因此Sonar投诉对我们无用。只有对于计算值(或不能精确表示为浮点数或加倍值的断裂值),对相等性检验的抱怨才有意义。
我现在的问题是:更改代码以使Sonar不再抱怨这一点的最佳实践是什么?
我看到几个选项:
- 将“未设置测试”提取到特殊的测试函数中;但这只会减少发生次数(减少到1次),而不是一般问题。
- 标记Sonar的代码以使用特殊的装饰器忽略它。但我们希望避免使用这样的装饰器。
- 将比较隐藏在sth like or后面(目前对于Sonar来说似乎没问题)。
(0.0 <= x && x <= 0.0)
!(x != 0.0)
- 调用以比较值的位,如下所示:。
Double.doubleToRawLongBits()
(Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(0.0))
- 其他想法?
这些解决方案都不是我真正喜欢的,我想,也许,有一个更好的解决方案,我想不出。