Java BigDecimal: Fließkommazahlen ohne Rundungsfehler meistern
Mit der Java-Klasse BigDecimal lassen sich komplexe Fließkommazahlen exakt verarbeiten. Nachdem diese erstellt wurden, können sie über verschiedene Methoden genutzt werden. Die Syntax bleibt dabei stets logisch aufgebaut, sodass auch Einsteiger:innen nach einer kurzen Eingewöhnungsphase problemlos mit der Klasse arbeiten können.
Was ist Java BigDecimal?
Hinter Java BigDecimal steckt eine Klasse, mit der du komplexe Gleitkommazahlen in theoretisch unbegrenzter Größe präzise darstellen und berechnen kannst. Über diverse Methoden, die wir dir hier vorstellen, führst du Operationen in den Bereichen Arithmetik, Abrundung, Formatkonvertierung, Hashing sowie detaillierte Vergleiche mit höchster Genauigkeit durch.
Java BigDecimal setzt sich aus einer 32-Bit-Integer-Skala und einem unskalierten („unscale“) Integer-Wert mit variabler Präzision zusammen. Der Begriff „Scale“ definiert dabei die Anzahl der Nachkommastellen (sofern ≥ 0). Bei einem Wert kleiner als Null erfolgt eine Multiplikation mit „10^(-scale)“. Die Kapazität der Klasse wird lediglich durch den verfügbaren Arbeitsspeicher begrenzt – ein Limit, das in der Praxis kaum erreicht wird. Während BigDecimal speziell für Gleitkommazahlen konzipiert ist, nutzt du für Ganzzahlen die Klasse BigInteger.
Wofür wird die Klasse benötigt?
Aufgrund der hohen Präzision ist Java BigDecimal nicht für jedes Projekt erforderlich. Es gibt jedoch Bereiche, in denen die Klasse unverzichtbar ist. Überall dort, wo bereits kleinste Abweichungen große Folgen haben, ist sie der Standard – etwa im E-Commerce bei Finanztransaktionen. Auch für Statik-Analysen, in der Medizintechnik oder bei der Steuerung von Luft- und Raumfahrzeugen vertraut man auf Java BigDecimal. In vielen anderen Softwareprojekten sorgt die genaue Berechnung schlicht für maximale Sicherheit.
Wie wird ein Objekt erstellt?
Um BigDecimal zu nutzen, musst du die Klasse zuerst in dein Programm importieren. Danach kannst du ein Objekt deklarieren, den gewünschten Wert als Argument definieren und diesen an den Java-Konstruktor übergeben. Sobald das erledigt ist, stehen dir die BigDecimals für Berechnungen zur Verfügung. Im Folgenden zeigen wir dir, wie du die Klasse importierst und zwei Beispiel-Objekte anlegst:
/ / Ihr Java-Programm für die BigDecimal-Klasse
import java.math.BigDecimal;
public class BigDecimalBeispiel
{
public static void main(String[] args)
{
/ / Zwei neue BigDecimals erstellen
BigDecimal BeispielEins =
new BigDecimal ("1275936001.744297361");
BigDecimals BeispielZwei =
new BigDecimal ("4746691047.132719503");
}
}javaDiese Objekte kannst du nun mit den passenden Methoden weiterverarbeiten.
Beispiele für Java BigDecimal
Sobald deine Objekte bereitstehen, nutzt du Methoden für verschiedene Operationen. Wir zeigen dir anhand einfacher Beispiele, wie du Ergebnisse erzielst. Die Ausgabe startest du mit dem Java-Befehl System.out.println().
Zwei BigDecimals addieren
Für die Addition von zwei BigDecimals nutzt du die Methode add(). Du gibst einfach die Werte an, die zusammengerechnet werden sollen. Hier addieren wir „BeispielEins“ und „BeispielZwei“:
BeispielEins =
BeispielEins.add(BeispielZwei);
System.out.println ("Das gesuchte Ergebnis nach der Addition lautet: " + BeispielEins);javaZahlen subtrahieren
Um Werte voneinander abzuziehen, verwendest du subtract(). In diesem Beispiel ziehen wir „BeispielZwei“ von „BeispielEins“ ab:
BeispielEins =
BeispielEins.subtract(BeispielZwei);
System.out.println ("Das gesuchte Ergebnis nach der Subtraktion lautet: " + BeispielEins);javaWerte multiplizieren
Die Multiplikation funktioniert nach dem gleichen Prinzip über die Methode multiply(), wobei das Objekt „multiplier“ als Argument dient. Der Code für das Produkt aus „BeispielZwei“ und „BeispielEins“ sieht so aus:
BeispielEins =
BeispielEins.multiply(BeispielZwei);
System.out.println ("Das gesuchte Ergebnis nach der Multiplikation lautet: " + BeispielEins);javaZahlen dividieren
Bei der Division greifst du auf divide() zurück. Die Syntax bleibt gewohnt einfach:
BeispielEins =
BeispielEins.divide(BeispielZwei);
System.out.println ("Das gesuchte Ergebnis nach der Division lautet: " + BeispielEins);javaBeachte jedoch: Das klappt nur reibungslos, wenn das Ergebnis exakt oder eine ganze Zahl ist. Andernfalls erscheint die Fehlermeldung java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. (Laufzeitfehler). Um dies zu verhindern, bietet die divide-Methode verschiedene Rundungsoptionen via java.math.RoundingMode:
| Konstante | Funktion |
|---|---|
| CEILING | Rundet in Richtung positiv unendlich. |
| DOWN | Rundet in Richtung Null ab. |
| FLOOR | Rundet in Richtung negativ unendlich. |
| HALF_DOWN | Rundet zum nächsten Nachbarn; bei gleichem Abstand weg von der Null. |
| HALF_EVEN | Rundet zum nächsten Nachbarn; bei gleichem Abstand zur nächsten geraden Zahl. |
| HALF_UP | Rundet zum nächsten Nachbarn; bei gleichem Abstand in Richtung Null. |
| UNNECESSARY | Erlaubt nur exakte Berechnungen ohne Rundung. Führt bei nicht-exakten Werten zum Fehler. |
| UP | Rundet von der Null weg auf. |
Überblick der wichtigsten Methoden
Zum Abschluss findest du hier eine Zusammenfassung der zentralen Methoden für die Arbeit mit BigDecimals in Java.
| Methode | Funktion |
|---|---|
| abs() | Liefert den absoluten Betrag des BigDecimals. |
| add() | Berechnet die Summe aus dem aktuellen Wert und dem Addend. |
| divide() | Berechnet den Quotienten (Wert / Divisor). |
| max(BigDecimal val) | Ermittelt den Maximalwert des BigDecimals. |
| min(BigDecimal val) | Ermittelt den Minimalwert des BigDecimals. |
| movePointLeft(int n) | Verschiebt das Komma um n Stellen nach links. |
| movePointRight(int n) | Verschiebt das Komma um n Stellen nach rechts. |
| multiply(BigDecimal multiplicand, MathContext mc) | Berechnet das Produkt (Wert * Multiplikant). |