ProgrammierungJava-Entwickler

Was sind die Besonderheiten der Arbeit mit den Datentypen float und double in Java? Wann sollte man jeden von ihnen anwenden und welche Fallstricke gibt es beim Arbeiten mit Fließkommazahlen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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.

  • Wann float verwenden: wenn strenge Anforderungen an den Speicherplatz bestehen (z. B. viele Zahlen in einem Array, ressourcenbeschränktes Gerät).
  • Wann double verwenden: praktisch immer, wenn es keine speziellen Einschränkungen gibt, da double eine bessere Genauigkeit bietet.

Wichtige Besonderheiten:

  • Operationen mit Fließkommazahlen können zu kumulativen Rundungsfehlern führen.
  • Verwenden Sie niemals == zum Vergleichen von float/double, verwenden Sie Vergleiche mit einer Toleranz.

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"); } } }

Fangfrage

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.

Beispiele für reale Fehler aufgrund Unwissenheit über die Feinheiten des Themas


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.