测试浮点相等.(FE_FLOATING_POINT_EQUALITY)

tar*_*oca 20 java ant findbugs

我在ANT脚本中使用了一个findbugs,我无法弄清楚如何解决我的两个错误.我已阅读文档,但不明白.以下是我的错误以及与之相关的代码:

错误1:测试浮点相等性.(FE_FLOATING_POINT_EQUALITY)

private boolean equals(final Quantity other) {
    return this.mAmount == convertedAmount(other);
}
Run Code Online (Sandbox Code Playgroud)

错误2:EQ_COMPARETO_USE_OBJECT_EQUALS

public final int compareTo(final Object other) {
    return this.description().compareTo(((Decision) other).description());
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了ComparesTo问题的文档

强烈建议,但并非严格要求(x.compareTo(y)== 0)==(x.equals(y)).一般来说,任何实现Comparable接口并且违反此条件的类都应该清楚地表明这一事实.推荐的语言是"注意:此类具有与equals不一致的自然顺序."

还有关于浮点平等的文档

此操作比较两个浮点值是否相等.由于浮点计算可能涉及舍入,因此计算的浮点值和双精度值可能不准确.对于必须精确的值,例如货币值,请考虑使用固定精度类型,例如BigDecimal.对于不必精确的值,请考虑比较某些范围内的相等性,例如:if(Math.abs(x-y)<.0000001).请参阅Java语言规范,第4.2.4节.

我不明白.有人可以帮忙吗?

Gro*_*uez 19

问题1:

对于FE_FLOATING_POINT_EQUALITY问题,您不应该直接将两个浮点值与==运算符进行比较,因为由于微小的舍入错误,即使条件value1 == value2不成立,值也可能在语义上与您的应用程序"相等" .

要解决此问题,请按以下方式修改代码:

private boolean equals(final Quantity other) {
    return (Math.abs(this.mAmount - convertedAmount(other)) < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)

其中EPSILON是您应在代码中定义的常量,表示应用程序可接受的小差异,例如.0000001.

问题2:

对于EQ_COMPARETO_USE_OBJECT_EQUALS问题:强烈建议在任何地方x.compareTo(y)返回零,x.equals(y)应该是true.在您已实现的代码中compareTo,但您没有覆盖equals,因此您继承了equalsfrom 的实现Object,并且不满足上述条件.

为了解决这个问题,重写equals(也许是hashCode)在你的类,这样当x.compareTo(y)返回值为0,那么x.equals(y)将返回true.

  • `equals`方法应该是可传递的(http://javarevisited.blogspot.fr/2011/02/how-to-write-equals-method-in-java.html)并且与`hashCode`方法一致.请告诉我们更多关于你的`equals`实现``(Math.abs(this.mAmount - convertedAmount(other))<EPSILON)`以及它如何满足这些命令. (3认同)

mar*_*ton 6

对于浮点警告,您应该记住浮点数是一种不精确的类型.给出的标准参考(也许值得一读)是:

每个计算机科学家应该知道的关于浮点运算的大卫戈德伯格.

因为浮点数不是精确值 - 即使它们在向上舍入到几位小数时看起来相同 - 它们可能会略有不同,并且无法匹配.

可比的界面预计在其执行者一定的行为; 警告告诉你你没有遵守这一点,并提供建议的行动.