12+4 > 16 | 5.2-1.2 <= 2.0+2 | 2*3-4 == 1+1 |
false | true | true |
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.
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."); } }