In Java gibt es zwei Haupttypen zur Darstellung von Fließkommazahlen: float (32 Bit) und double (64 Bit). float ist weniger genau und belegt weniger Speicher, während double eine höhere Genauigkeit bietet und der bevorzugte Standardtyp für Fließkommazahlen ist.
Wichtige Besonderheiten:
Beispiel für den Vergleich mit Delta:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("Gleich unter Berücksichtigung der Toleranz"); } else { System.out.println("Nicht gleich"); } } }
Frage: Was wird der folgende Code ausgeben?
System.out.println(0.1 + 0.2 == 0.3);
Antwort: Dieser Code wird false ausgeben, weil das Ergebnis der Summe 0.1 + 0.2 im binären Format IEEE 754 nicht genau gleich 0.3 ist, aufgrund der Besonderheiten der Speicherung von Dezimalzahlen in den Datentypen float und double.
Geschichte
In einem großen Finanzprojekt wurden Geldzähler im Typ double verwendet. In der Praxis führten kleine Operationen oft zu kumulativen Rundungsfehlern, was dazu führte, dass die Endbeträge um einige Cent abwichen. Das Problem wurde durch den Austausch von double gegen BigDecimal behoben.
Geschichte
In einer Spiel-Engine wurde ein float-Array zum Speichern der Objektkoordinaten in einer Welt mit großen Werten verwendet. Bei der Bewegung über große Entfernungen begann die Genauigkeit der Objektpositionierung zu verlieren, was zu einem "Zittern" der Objekte auf dem Bildschirm führte. Der Austausch von float gegen double und das Zentrieren der Koordinaten halfen, das Problem zu beheben.
Geschichte
In einem Programm zur statistischen Analyse wurden doppelte Werte mit dem Operator
==verglichen, was eine unerwartete Anzahl von "Nichtübereinstimmungen" ergab. Nach der Umstellung auf einen Vergleich mit Delta funktionierte die Logik des Programms korrekt.