12+4 > 16 | 5.2-1.2 <= 2.0+2 | 2*3-4 == 1+1 |
false | true | true |
Was glauben Sie ist das Ergebnis des Booleschen Ausdrucks:
4.0/3.0 == 1.0 + 1.0/3.0
Vermutlich denken Sie, dass er wahr ist.
Vermutlich ist er es.
Aber nicht sicher.
Gleitpunkt-Arithmetik ist nicht exakt.
Sie 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.
Sie 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 unzweifelhafte Genauigkeit gebraucht wird,
wird Ganzzahl-Arithmetik verwendet.
Das ist einer der Gründe, warum Java über 64-Bit long
Ganzzahlen verfügt.