zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite

Antwort:

12+4 > 16 5.2-1.2 <= 2.0+22*3-4 == 1+1
false true true

Gefahr bei dem Vergleich von Double-Werten

Was denkt Ihr ist das Ergebnis des Boole'schen Ausdrucks:

4.0/3.0 == 1.0 + 1.0/3.0

Vermutlich denkt Ihr, dass er wahr ist. Vermutlich ist er es. Aber nicht sicher. Gleitpunktarithmetik ist nicht immer exakt.

Wir sollten niemals einem exakten "Ist-Gleich" Vergleich bei Gleitpunktzahlen trauen.

Das Problem besteht darin, dass manche Zahlen eine unbegrenzte Anzahl von Bits benötigen, um exakt dargestellt werden zu können.

Für diese Zahlen ist selbst ein 64-Bit double nicht exakt.

Wir sind mit dieser Situation was die Papier-und-Bleistift-Arithmetik betrifft vertraut. Zum Beispiel, ist das Folgende wahr?

1.0/3.0 == 0.3333333

Es ist nicht wahr, da die Dezimalzahl auf der rechten Seite nur eine Annäherung ist. Bei mehr Dezimalstellen wird die Annäherung besser, aber sie ist niemals gleich dem Bruch. Das Gleiche passiert bei Java (und allen anderen Programmiersprachen). Zum Beispiel, das Folgende könnte falsch ergeben:

1.0/10.0 == 0.1

Manchmal, wenn exakte Genauigkeit gebraucht wird, wird Ganzzahlarithmetik verwendet. Das ist einer der Gründe, warum Java über 64-Bit long Ganzzahlen verfügt.

FRAGE 5:

Was ist die Ausgabe des Folgenden:

class DezimalBruch
{
  public static void main (String[] args)
  {
    float x = 1.0f;
    float y = 10.0f;

    if ( x/y == 0.1 )
      System.out.println("Kuchen kaufen!"  );
    else
      System.out.println("Kein Kuchen heute.");
  }
}