Java rechnet falsch

Java ist nach wie vor eine der populärsten Programmiersprachen. Gemäß dem TIOBE-Index, der seit 2001 Suchmaschinenanfragen analysiert, liegt Java momentan auf Platz 1 des Rankings. Ähnlich verhält es sich beim RedMonk-Programmiersprachenindex und dem „Programming Language Popularity“-Index, bei denen Java jeweils den 2. Platz belegt. Umso erstaunlicher erscheint es, dass folgendes Programm, welches 0,1 und 5,3 addieren soll, zu einem fehlerhaften Ergebnis führt:
Die Differenz zum richtigen Ergebnis mag zunächst marginal erscheinen – bei realen Anwendungsfällen wie finanzmathematischen Berechnungen sind diese geringen Abweichungen jedoch ausschlaggebend. Worin liegt also der Fehler? Zunächst einmal handelt es sich hierbei um keinen Fehler in Java, sondern eine Eigenart der Fließkommaarithmetik, die beispielsweise auch in C++ und vielen anderen Programmiersprachen auftritt. Dabei können bestimmte Dezimalzahlen nicht korrekt im Binärsystem wiedergegeben werden. Wenn wir also die Dezimalzahl 0,1 in das Binärsystem übertragen ergibt sich die folgende unendliche Zeichenfolge: 0,000110011001100110011001100110011001100110... Für diese sogenannten periodischen, nicht abbrechenden Zahlen gibt es zahlreiche weitere Beispiele, die letztlich alle dazu führen, dass sie in einer float oder double-Variable nicht exakt abgespeichert werden können. Wenn Sie in Ihren Java-Berechnungen also mit Geldbeträgen hantieren oder grundsätzlich absolute Präzision benötigen, sind die beiden primitiven Datentypen double und float nicht für Sie geeignet.

 

Lösungen für die falschen Rechnungen

Glücklicherweise gibt es aber mehrere Lösungen für dieses Problem. Wenn es sich bei Ihren Rechnungen lediglich um Additionen und Subtraktionen mit Geldbeträgen handelt können Sie die Eurobeträge einfach als Centbeträge im Integer-Format abzuspeichern. Wenn diese ganzen Zahlen nun miteinander verrechnet werden, gibt es keine Probleme. Sollten jedoch Division und Multiplikation oder Rechnungen ohne Geldbeträge nötig sein, kann die BigDecimal-Klasse eine Lösung darstellen. Das Rechenproblem zu Beginn des Artikels kann damit wie folgt gelöst werden:
Zusammenfassend lässt sich sagen, dass die BigDecimal-Klasse verwendet werden sollte, wenn absolut präzise Rechenoperationen von Nöten sind. Hierbei muss jedoch auch beachtet werden, dass Rechnungen mit BigDecimal bis zu 100 Mal langsamer sind als mit double oder float.

 

Category
Beliebtesten Einträge:

Jetzt unverbindlich anfragen!