Warum nicht double für Geldbeträge?
Probleme mit der Gleitkommapräzision
Warum nicht double für Geldbeträge? ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Ein gefährlicher Standardwert
Es liegt nahe, Preise in einem double zu speichern. Leider kann double die meisten Dezimalbrüche nicht exakt darstellen, was zu kleinen Fehlern führt, die Finanzberechnungen verfälschen.
Die klassische Überraschung
Wenn Sie 0.1 und 0.2 mit double addieren, erhalten Sie nicht 0.3. Stattdessen erhalten Sie einen Wert mit einem kleinen Rundungsfehler.
public class Main {
public static void main(String[] args) {
double result = 0.1 + 0.2;
System.out.println(result);
}
}Warum das passiert
Computer speichern double binär. So wie sich ein Drittel im Dezimalsystem nicht exakt darstellen lässt, können viele Dezimalzahlen wie 0.1 im Binärsystem nicht exakt dargestellt werden.
Gespeichert wird die nächstgelegene binäre Näherung, und der Fehler summiert sich.
Fehler summieren sich
Ein einzelner kleiner Fehler mag harmlos erscheinen, aber in einer Schleife über Tausende von Transaktionen summieren sich die Abweichungen zu sichtbaren Fehlern.
public class Main {
public static void main(String[] args) {
double total = 0.0;
for (int i = 0; i < 10; i++) {
total += 0.1;
}
System.out.println(total);
}
}Fehlgeschlagener Gleichheitsvergleich
Aufgrund von Rundungsfehlern schlägt der Vergleich berechneter double-Werte mit == häufig fehl, obwohl Sie erwarten, dass sie gleich sind.
public class Main {
public static void main(String[] args) {
double a = 0.1 + 0.2;
double b = 0.3;
System.out.println(a == b);
}
}Geld muss exakt sein
Im Finanzwesen ist ein Fehler im Bruchteil eines Cents nicht akzeptabel. Prüfer erwarten, dass die Summen bis auf den Cent übereinstimmen.
Deshalb sollten Geldbeträge niemals als Gleitkommatyp gespeichert werden.
Die Lösung: BigDecimal
Java stellt BigDecimal bereit, eine Klasse, die Dezimalzahlen exakt speichert. Sie verwaltet den unskalierten Wert und die Skalierung getrennt, sodass 0.1 tatsächlich 0.1 bedeutet.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b));
}
}Immer den String-Konstruktor verwenden
Erstellen Sie ein BigDecimal aus einem String, nicht aus einem double. Die Übergabe eines double übernimmt den binären Fehler in das BigDecimal.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal fromDouble = new BigDecimal(0.1);
BigDecimal fromString = new BigDecimal("0.1");
System.out.println(fromDouble);
System.out.println(fromString);
}
}Oder valueOf verwenden
BigDecimal.valueOf ist eine sichere Abkürzung. Die Methode konvertiert den double anhand seiner kanonischen String-Darstellung und vermeidet dadurch den unveränderten binären Fehler.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal price = BigDecimal.valueOf(19.99);
System.out.println(price);
}
}Geld als Cents speichern
Eine Alternative für einfache Fälle besteht darin, Geldbeträge mit long als ganzzahlige Anzahl von Cents zu speichern. Dann entsprechen 19.99 Dollar 1999 Cents, und alle Berechnungen erfolgen als exakte Ganzzahlarithmetik.
public class Main {
public static void main(String[] args) {
long cents = 1999;
long total = cents * 3;
System.out.println(total + " cents");
}
}Das Wichtigste
Verwenden Sie float und double für wissenschaftliche Berechnungen und Grafiken, bei denen kleine Fehler akzeptabel sind. Für Geldbeträge und jeden Wert, der exakt sein muss, verwenden Sie BigDecimal oder ganzzahlige Centbeträge.
Kurzer Test
Testen Sie Ihr Verständnis der Gleitkommapräzision.
Zusammenfassung
Sie haben gelernt, warum double für Geldbeträge ungeeignet ist:
- Binäre Gleitkommazahlen können viele Dezimalzahlen nicht exakt speichern
- Fehler wie bei
0.1 + 0.2, das nicht 0.3 ergibt, summieren sich - Verwenden Sie
BigDecimalfür exakte Dezimalarithmetik - Erstellen Sie es aus einem String oder mit
valueOf, niemals aus einem unveränderten double - Das Speichern ganzzahliger Cents ist eine weitere exakte Möglichkeit
Lerne Java mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 104
- Lektionen
- 374
Häufig gestellte Fragen
Ist die Lektion „Warum nicht double für Geldbeträge?“ kostenlos?
Ja — der vollständige Text von „Warum nicht double für Geldbeträge?“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Warum nicht double für Geldbeträge?“?
Probleme mit der Gleitkommapräzision Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Warum nicht double für Geldbeträge?“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum nicht double für Geldbeträge?
- Mit BigDecimal arbeiten
- Rundung und Scale
- BigInteger für riesige Zahlen