Geldbeträge in Programmen richtig speichern
Kurz: Geld speichert man nie als Fließkommazahl (float/double), sondern als ganze Zahl in der kleinsten Einheit (Cent) oder als exakten Dezimaltyp.
Genauer: Binäre Fließkommazahlen können viele Dezimalbrüche nicht genau darstellen. 0.1 + 0.2 ergibt in den meisten Sprachen 0.30000000000000004. Bei Beträgen summieren sich solche Abweichungen.
Im Detail
- Ganze Cent: 19,99 € werden als
1999gespeichert. Addition und Vergleich sind exakt. Nur bei Anzeige durch 100 teilen. - Dezimaltypen:
DECIMAL(12,2)in SQL,BigDecimal(Java),Decimal(Python, C#). Sie rechnen im Zehnersystem. - Währung mitführen: Betrag und Währungscode (EUR, JPY …) gehören zusammen. Nicht alle Währungen haben zwei Nachkommastellen (JPY: 0, KWD: 3).
- Runden: Die Rundungsregel ist fachlich festzulegen (kaufmännisch, Banker’s Rounding) und nur am Ende von Rechenketten anzuwenden. Prozente und Steuern führen zu Bruchteilen von Cent.
- Verteilen: Beim Aufteilen (100 € auf 3) bleibt ein Rest-Cent, der bewusst zugewiesen werden muss.
- Austausch: In JSON Beträge als Zeichenkette oder ganze Cent übertragen, nicht als Zahl mit Nachkommastellen.
Siehe auch: Gleitkommazahl