Blog

Blog

Neues aus unserem Blog

Gleich und doch verschieden

Manfred Heiland Dienstag, 22. April 2014 @ 11:00 geschrieben von Manfred Heiland

Eine oft vergessene Tatsache ist das Verhalten der equals()-Methode der Klasse BigDecimal. In einer Code-Review-Session ist mir das in der vergangenen Woche wieder bewusst geworden. Die Aufgabenstellung ist relativ einfach:
"Sind zwei Zahlen gleich?" sollte sich doch einfach bestimmen lassen. Jedoch leitet uns die wörtliche Übersetzung von equal (= gleich) zur falschen Lösung.

...
BigDecimal einsKommaNull = new BigDecimal("1.0");
BigDecimal eins = new BigDecimal("1");
 
if (eins.equals(einsKommaNull)) {
  System.out.println("gleich");
}
else {
  System.out.println("ungleich");
}
...

Der Text führt ja schon daraufhin, dass in diesem Code-Snippet "ungleich" auf der Konsole erscheint. Equals berücksichtigt für den Vergleich auch die "Scale" der BigDecimal-Objekte und diese sind hier nun einmal ungleich. Die Übersetzung der Tätigkeitsbeschreibung "vergleichen" führt uns zur Methode compareTo(), die für die Aufgabenstellung besser geeignet ist.

...
if (eins.compareTo(einsKommaNull) == 0) {
 
  System.out.println("gleich");
}
else {
  System.out.println("ungleich");
}
...

So bekommen wir auch das von uns gewünschte Ergebnis auf die Konsole ausgegeben.

Das Studium der Javadoc hält noch eine weitere, von mir noch nicht gesehene, Alternative bereit.

...
if (eins.stripTrailingZeros().equals(einsKommaNull.stripTrailingZeros())) {
  System.out.println("gleich");
}
else {
  System.out.println("ungleich");
}
...

Durch die Verwendung der Methode stripTrailingZeros() wird die Scale "normalisiert". Durch den Methodennamen wird hier schon eine Dokumentation erreicht. Ich könnte mir vorstellen, dass dadurch das Refactoring von compareTo() zu equals() von übereifrigen Codierern verhindert wird. Hier möchte ich noch auf einen alten Bug in Java "1.5.0_06" hinweisen.

Ich bleibe jedenfalls bei meinem Grundsatz Vergleiche mit Zahlen in Java mit der compareTo()-Methode zu bewerkstelligen.


zur Übersicht

Willkommen auf dem avono Blog

Hier auf dem avono Blog finden Sie in regelmäßigen Abständen sowohl technische Neuigkeiten aus unserer Partnerproduktwelt als auch nützliche Entwicklertipps.
Und jetzt kommt der obligatorische Disclaimer: Die Ausführungen der Blogeinträge spiegeln nicht die Meinung der avono AG sondern nur die Sicht der einzelnen Autoren wider.

Weitere Blogeinträge