Eintauchen in die Tiefen der ArithmeticException: Non-Terminating Division
Der Codeausschnitt lieferte Versuche, zwei BigDecimal-Objekte (a und b) zu dividieren ). Diese Operation führt jedoch zu der folgenden Ausnahme:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
Um diese Ausnahme zu entschlüsseln, müssen wir uns mit den komplizierten Details der BigDecimal-Arithmetik befassen.
Das Wesen der exakten Arithmetik
Wie in der Java 11 BigDecimal-Dokumentation angegeben, wenn der MathContext Wenn die Genauigkeit des Objekts auf 0 gesetzt ist (z. B. MathContext.UNLIMITED), liefern arithmetische Operationen (einschließlich der Division ohne MathContext) genaue Ergebnisse. Dies war das einzige Verhalten in Versionen vor 5.
Unendliche Dezimalerweiterungen und Genauigkeit
Als Konsequenz der Berechnung exakter Ergebnisse ist die Rundungsmoduseinstellung eines MathContext-Objekts mit Genauigkeit 0 wird irrelevant. Für die Divisionsoperation könnte der Quotient eine unendliche Dezimalentwicklung haben, z. B. 1 dividiert durch 3.
Umgang mit nicht terminierenden Erweiterungen
Wenn der Quotient eine Nicht-Dezimalzahl hat -Beenden Sie die Dezimalerweiterung und die Operation muss ein genaues Ergebnis zurückgeben, wird eine ArithmeticException ausgelöst. Umgekehrt wird der genaue Quotient zurückgegeben, wenn das Ergebnis endlich ist.
Lösung für nicht terminierende Divisionen
Um dieses Problem zu beheben, können Sie eine Methode wie diese verwenden:
a.divide(b, 2, RoundingMode.HALF_UP)
Hier stellt 2 den Maßstab dar und RoundingMode.HALF_UP gibt die Rundung an Methode.
Zusätzliche Ressourcen
Weitere Informationen finden Sie in der Java 11 BigDecimal-Dokumentation und in diesem aufschlussreichen Blogbeitrag.
Das obige ist der detaillierte Inhalt vonWarum löst die Division „BigDecimal' eine „ArithmeticException' für nicht abschließende Dezimalzahlen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!