Vermeiden von Gleitkomma-Präzisionsfehlern mit Floats und Doubles in Java
Bei der Arbeit mit großen Summen von Floats oder Doubles in Java kommt es zu einer Anhäufung von Gleitkommazahlen Präzisionsfehler können ein Problem sein. Dieser Fehler tritt auf, weil Floats oder Doubles bestimmte numerische Werte wie 0,1 nicht präzise darstellen können.
Beachten Sie den folgenden Code:
for (float value = 0.0f; value < 1.0f; value += 0.1f) { System.out.println(value); }
Erwartete Ausgabe:
0.1 0.2 0.3 ... 0.9
Tatsächliche Ausgabe:
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001
Wie offensichtlich ist, weicht die Ausgabe aufgrund von Gleitkomma-Ungenauigkeiten von den erwarteten Werten ab. Um dieses Problem zu lösen, gibt es zwei Hauptansätze:
1. Passen Sie die Anzeigegenauigkeit an und lassen Sie Toleranzen zu.
Beschränken Sie bei Verwendung des Doppeltyps die Anzeige auf die erforderliche Anzahl von Ziffern und führen Sie eine kleine Toleranz für Gleichheitsprüfungen ein. Dies ermöglicht die Darstellung von Zahlen wie 0,1 ohne nennenswerte Rundungsfehler.
2. Verwenden Sie BigDecimal für eine präzise Darstellung
Alternativ können Sie BigDecimal anstelle von Floats oder Doubles verwenden. BigDecimal bietet eine Möglichkeit, Zahlen mit beliebiger Genauigkeit darzustellen, Rundungsfehler zu vermeiden und eine exakte Darstellung von Werten wie 0,1 zu ermöglichen.
Unten ist ein Beispiel für die Verwendung von BigDecimal:
BigDecimal step = new BigDecimal("0.1"); for (BigDecimal value = BigDecimal.ZERO; value.compareTo(BigDecimal.ONE) < 0; value = value.add(step)) { System.out.println(value); }
Dieser Code wird gedruckt :
0.1 0.2 0.3 ... 0.9
Durch die Wahl des geeigneten Ansatzes können Entwickler Gleitkomma-Präzisionsfehler bei der Arbeit mit Floats oder Doubles in Java effektiv minimieren oder beseitigen.
Das obige ist der detaillierte Inhalt vonSo vermeiden Sie Gleitkomma-Präzisionsfehler in Java: Floats, Doubles und BigDecimal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!