Ich verwende ein Findbugs in einem ANT-Skript und ich kann nicht herausfinden, wie zwei meiner Fehler behoben werden. Ich habe die Dokumentation gelesen, verstehe sie aber nicht. Hier sind meine Fehler und der Code, der zu ihnen gehört:Test auf Gleitkomma-Gleichheit. (FE_FLOATING_POINT_EQUALITY)
Fehler 1: Test für Gleitpunktgleichheit. (FE_FLOATING_POINT_EQUALITY)
private boolean equals(final Quantity other) {
return this.mAmount == convertedAmount(other);
}
Fehler 2: EQ_COMPARETO_USE_OBJECT_EQUALS
public final int compareTo(final Object other) {
return this.description().compareTo(((Decision) other).description());
}
ich die Dokumentation für die ComparesTo Ausgabe gelesen haben, die besagt,
Es wird dringend empfohlen, ist aber nicht unbedingt erforderlich, dass (x.compareTo (y) == 0) == (x.equals (y)). Im Allgemeinen sollte jede Klasse, die die Vergleichsschnittstelle implementiert und diese Bedingung verletzt, diese Tatsache deutlich angeben. Die empfohlene Sprache ist "Anmerkung: Diese Klasse hat eine natürliche Reihenfolge, die mit Gleichen nicht übereinstimmt."
und auch die Dokumentation in Bezug auf die Floating-Point-Gleichheit
Dieser Vorgang vergleicht zwei Gleitkommazahlen für die Gleichstellung. Da Fließkommaberechnungen Rundungen beinhalten können, sind die berechneten Float- und Double-Werte möglicherweise nicht genau. Verwenden Sie für Werte, die genau sein müssen, z. B. Geldwerte, einen Typ mit fester Genauigkeit, z. B. BigDecimal. Für Werte, die nicht präzise sein müssen, sollten Sie einen Vergleich für die Gleichheit in einem bestimmten Bereich in Betracht ziehen, zum Beispiel: if (Math.abs (x - y) < .0000001). Siehe die Java-Sprachspezifikation, Abschnitt 4.2.4.
Ich verstehe es aber nicht. Kann mir bitte jemand helfen?
Ein 'equals' Methode sollte transitiv sein (http://javarevisited.blogspot.fr/2011/02/ how-to-write-equals-Methode-in-java.html) und konsistent mit der Methode 'hashCode'. Bitte erzähle uns mehr über deine'Equals'-Implementierung als '(Math.abs (this.mAmount - convertedAmount (andere)
@PascalCuoq hast du das gelöst? Eine Möglichkeit, die ich mir vorstellen kann, besteht darin, Float in BigDecimal umzuwandeln, auf Genauigkeit, die Sie benötigen, und Hash dafür zu berechnen. Aber es wird Auswirkungen auf die Leistung haben. –
@AlexanderMalakhov Ich bin nicht die Person, die die Frage gestellt hat. Ich habe nur einen Kommentar zur Angemessenheit der Definition einer nicht-transitiven "equals" -Methode abgegeben. Es gibt kein Problem, hier zu "lösen". Gleitkommawerte können gehashed werden und können mit den Grundoperatoren verglichen werden, die Java bereits anbietet. Jeder, der eine nicht-transitive "equals" -Methode definiert, erzeugt ein Problem für sich selbst, und die einfachste Art, das Problem zu lösen, besteht darin, es nicht erst zu erstellen. –