BigDecimal für Finanzberechnungen
Verwenden Sie BigDecimal, um Gleitkomma-Genauigkeitsfehler bei Geld- und Steuerberechnungen zu vermeiden.
BigDecimal für Finanzberechnungen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
BigDecimal für Finanzberechnungen
Gleitkommatypen (double, float) können aufgrund der binären Darstellung nicht alle Dezimalwerte exakt darstellen. Verwenden Sie für Geldbeträge und Steuern BigDecimal.
Das Problem der Gleitkommazahlen
Binäre Gleitkommazahlen führen zu kleinen Rundungsfehlern. In Finanzanwendungen summieren sich diese Fehler und verursachen echte Fehler.
double price = 0.1 + 0.2;
System.out.println(price); // 0.30000000000000004 (WRONG!)
System.out.println(price == 0.3); // false
// Real bug: total never equals expected
double total = 0;
for (int i = 0; i < 10; i++) total += 0.1;
System.out.println(total); // 0.9999999999999999BigDecimal sicher erstellen
Erstellen Sie BigDecimal immer aus einem String, nicht aus einem double. Bei Verwendung des double-Konstruktors wird die Ungenauigkeit von Gleitkommazahlen übernommen.
import java.math.BigDecimal;
// WRONG: double constructor
BigDecimal wrong = new BigDecimal(0.1);
System.out.println(wrong); // 0.1000000000000000055511...
// CORRECT: String constructor
BigDecimal correct = new BigDecimal("0.1");
System.out.println(correct); // 0.1
// Or use valueOf (also safe)
BigDecimal safe = BigDecimal.valueOf(0.1);
System.out.println(safe); // 0.1Grundlegende Arithmetik mit BigDecimal
BigDecimal verwendet für arithmetische Operationen Methodenaufrufe: add(), subtract(), multiply(), divide(). Diese geben neue BigDecimal-Instanzen zurück (unveränderlich).
import java.math.BigDecimal;
BigDecimal price = new BigDecimal("19.99");
BigDecimal tax = new BigDecimal("0.08");
BigDecimal qty = new BigDecimal("3");
BigDecimal subtotal = price.multiply(qty);
BigDecimal taxAmount = subtotal.multiply(tax);
BigDecimal total = subtotal.add(taxAmount);
System.out.println(subtotal); // 59.97
System.out.println(taxAmount); // 4.7976
System.out.println(total); // 64.7676Rundungsmodi
RoundingMode steuert, wie BigDecimal rundet. Wichtige Modi:
HALF_UP– Standardrundung (0,5 wird aufgerundet)HALF_EVEN– Bankrundung (0,5 wird auf die nächste gerade Zahl gerundet)DOWN– Abschneiden in Richtung nullCEILING– Runden in Richtung positiver Unendlichkeit
import java.math.*;
BigDecimal val = new BigDecimal("2.565");
System.out.println(val.setScale(2, RoundingMode.HALF_UP)); // 2.57
System.out.println(val.setScale(2, RoundingMode.HALF_EVEN)); // 2.56 (banker's)
System.out.println(val.setScale(2, RoundingMode.DOWN)); // 2.56
System.out.println(val.setScale(2, RoundingMode.CEILING)); // 2.57Division und Skalierung
Bei der Division mit BigDecimal müssen Sie Skalierung und Rundungsmodus angeben, um bei nicht abbrechenden Dezimalzahlen eine ArithmeticException zu vermeiden.
import java.math.*;
BigDecimal revenue = new BigDecimal("1000.00");
BigDecimal months = new BigDecimal("3");
// Without scale → ArithmeticException (non-terminating decimal)
try {
revenue.divide(months);
} catch (ArithmeticException e) {
System.out.println("Need to specify scale!");
}
// Correct: specify scale and rounding
BigDecimal monthly = revenue.divide(months, 2, RoundingMode.HALF_UP);
System.out.println(monthly); // 333.33BigDecimals vergleichen
Verwenden Sie zum Vergleichen von Werten compareTo(), nicht equals(). equals() berücksichtigt die Skalierung – 2.0 und 2.00 sind mit equals() NICHT gleich, mit compareTo() jedoch GLEICH.
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("2.00");
System.out.println(a.equals(b)); // false (different scale)
System.out.println(a.compareTo(b)); // 0 (same value)
System.out.println(a.compareTo(b) == 0); // true
// For sorting in collections
import java.util.*;
List<BigDecimal> prices = Arrays.asList(
new BigDecimal("3.50"), new BigDecimal("1.00"), new BigDecimal("2.75")
);
Collections.sort(prices);
System.out.println(prices); // [1.00, 2.75, 3.50]MathContext für signifikante Stellen
MathContext legt Präzision (signifikante Stellen) und Rundungsmodus fest. Verwenden Sie es, wenn Sie eine einheitliche Präzision anhand signifikanter Stellen statt anhand von Dezimalstellen benötigen.
import java.math.*;
MathContext mc = new MathContext(4, RoundingMode.HALF_UP);
BigDecimal a = new BigDecimal("1234567");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, mc);
System.out.println(result); // 4.115E+5 (4 significant digits)
// DECIMAL32, DECIMAL64, DECIMAL128 are standard MathContexts
BigDecimal precise = new BigDecimal("355").divide(
new BigDecimal("113"), MathContext.DECIMAL64);
System.out.println(precise); // 3.141592920353982...Beispiel: Warenkorb
Eine vollständige Warenkorbberechnung mit BigDecimal: Einzelpositionen, Steuer, Rabatt und Endsumme.
import java.math.*;
record LineItem(String name, BigDecimal price, int qty) {
BigDecimal subtotal() {
return price.multiply(new BigDecimal(qty));
}
}
var items = List.of(
new LineItem("Laptop", new BigDecimal("999.00"), 1),
new LineItem("Case", new BigDecimal("29.99"), 2),
new LineItem("Charger", new BigDecimal("49.99"), 1)
);
BigDecimal subtotal = items.stream()
.map(LineItem::subtotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal taxRate = new BigDecimal("0.09");
BigDecimal tax = subtotal.multiply(taxRate).setScale(2, RoundingMode.HALF_UP);
BigDecimal total = subtotal.add(tax);
System.out.println("Subtotal: " + subtotal);
System.out.println("Tax: " + tax);
System.out.println("Total: " + total);Stripe: Währung in Cent
Zahlungsdienstleister wie Stripe speichern Beträge als Ganzzahl-Centbeträge, um Dezimalprobleme vollständig zu vermeiden. Die Umrechnung zwischen Centbeträgen und Anzeigebeträgen ist ein gängiges Muster.
import java.math.*;
// Store as cents (long) for database / API
long amountCents = 999_99L; // $999.99
// Convert to BigDecimal for display
BigDecimal amount = BigDecimal
.valueOf(amountCents)
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
System.out.println("Amount: $" + amount); // Amount: $999.99
// Convert user input back to cents
BigDecimal input = new BigDecimal("49.95");
long cents = input.multiply(new BigDecimal("100"))
.setScale(0, RoundingMode.HALF_UP).longValueExact();
System.out.println("Cents: " + cents); // Cents: 4995Wann BigDecimal statt double verwenden
Wählen Sie den passenden Typ für die jeweilige Aufgabe:
- BigDecimal: Finanzbeträge, Steuern und Rechnungen, wenn eine exakte Dezimaldarstellung wichtig ist
- double: wissenschaftliche Berechnungen, Grafiken und ML – wenn Geschwindigkeit wichtig ist und kleine Fehler akzeptabel sind
- int/long cents: Zahlungs-APIs und die Speicherung von Geldbeträgen in Datenbanken
Schnelltest
Welche BigDecimal-Vergleichsmethode sollten Sie verwenden, um zu prüfen, ob zwei BigDecimal-Werte unabhängig von der Skalierung numerisch gleich sind?
Zusammenfassung: BigDecimal für Finanzberechnungen
Wichtigste Erkenntnisse:
- double/float verursachen Rundungsfehler – verwenden Sie sie niemals für Geldbeträge
- Erstellen Sie BigDecimal aus String oder BigDecimal.valueOf(), nicht aus double
- Verwenden Sie add(), subtract(), multiply() und divide() für arithmetische Operationen
- Geben Sie bei Divisionen immer Skalierung und RoundingMode an
- Verwenden Sie für Gleichheitsprüfungen compareTo(), nicht equals()
- Erwägen Sie, Geldbeträge für Datenbank- und API-Arbeiten als Ganzzahl-Centbeträge zu speichern
Häufig gestellte Fragen
Ist die Lektion „BigDecimal für Finanzberechnungen“ kostenlos?
Ja — der vollständige Text von „BigDecimal für Finanzberechnungen“ 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 „BigDecimal für Finanzberechnungen“?
Verwenden Sie BigDecimal, um Gleitkomma-Genauigkeitsfehler bei Geld- und Steuerberechnungen zu vermeiden. 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 3 von 4.
Wie lange dauert die Lektion „BigDecimal für Finanzberechnungen“?
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
- Grundlagen der Math-Klasse
- Ganzzahlarithmetik und Überlauf
- BigDecimal für Finanzberechnungen
- NumberFormat und printf