我在ANT腳本中使用findbugs,我無法弄清楚如何解決我的兩個錯誤。我已閱讀文檔,但不明白。以下是我的錯誤及其隨附的代碼:測試浮點相等。 (FE_FLOATING_POINT_EQUALITY)
錯誤1:測試浮點相等。 (FE_FLOATING_POINT_EQUALITY)
private boolean equals(final Quantity other) {
return this.mAmount == convertedAmount(other);
}
錯誤2:EQ_COMPARETO_USE_OBJECT_EQUALS
public final int compareTo(final Object other) {
return this.description().compareTo(((Decision) other).description());
}
我讀過的,指出
強烈建議,但沒有嚴格要求的ComparesTo問題的文件( x.compareTo(y)== 0)==(x.equals(y))。一般來說,任何實現了Comparable接口並違反這個條件的類都應該清楚地表明這個事實。推薦的語言是「注意:這個類的自然排序與equals不一致」。
而且對於浮點平等
此操作兩個浮點值是否相等比較文檔。由於浮點計算可能涉及四捨五入,所以計算的浮點數和雙精度值可能不準確。對於必須精確的值(例如貨幣值),請考慮使用固定精度類型,如BigDecimal。對於不需要精確的值,可以考慮在某個範圍內比較相等性,例如:if(Math.abs(x-y)< .0000001)。請參閱Java語言規範,第4.2.4節。
雖然我不明白。任何人都可以幫忙嗎?
的'equals'方法應該是傳遞(http://javarevisited.blogspot.fr/2011/02/ how-to-write-equals-method-in-java.html)並且與'hashCode'方法一致。請告訴我們關於'equals'實現的更多信息(Math.abs(this.mAmount - convertedAmount(other))
2013-07-27 18:42:19
@PascalCuoq你解決了這個問題嗎?我可以想到的一種方法是將float轉換爲BigDecimal,並將其轉換爲您需要的精度並計算哈希值。但會有性能影響。 – 2014-07-17 09:34:34
@AlexanderMalakhov我不是問這個問題的人。我只對定義非傳遞式「等號」方法的適當性發表了評論。這裏「解決」沒有問題。浮點值可以被散列,並且可以與Java已經提供的基本運算符進行比較。任何定義非傳遞式「等號」方法的人都會爲自己創造一個問題,解決問題的最簡單方法不是首先創建問題。 – 2014-07-17 09:39:17