Aus den Java 11- BigDecimal
Dokumenten :
Wenn ein MathContext
Objekt mit einer Genauigkeitseinstellung von 0 (zum Beispiel MathContext.UNLIMITED
) versorgt wird , sind die arithmetischen Operationen genau, ebenso wie die arithmetischen Methoden, die no annehmenMathContext
Objekt . (Dies ist das einzige Verhalten, das in Releases vor 5 unterstützt wurde.)
Als Folge der Berechnung des genauen Ergebnisses wird die Rundungsmoduseinstellung eines MathContext
Objekts mit einer Genauigkeitseinstellung von 0 nicht verwendet und ist daher irrelevant. Im Fall der Teilung könnte der exakte Quotient eine unendlich lange Dezimalerweiterung haben; Zum Beispiel 1 geteilt durch 3.
Wenn der Quotient eine nicht endende Dezimalerweiterung hat und die Operation angegeben wird, um ein genaues Ergebnis zurückzugeben, wird ein ArithmeticException
ausgelöst. Andernfalls wird das genaue Ergebnis der Aufteilung zurückgegeben, wie dies bei anderen Vorgängen der Fall ist.
Um dies zu beheben, müssen Sie Folgendes tun :
a.divide(b, 2, RoundingMode.HALF_UP)
Dabei ist 2 die Skalierung und RoundingMode.HALF_UP der Rundungsmodus
Weitere Details finden Sie in diesem Blogbeitrag .
precision
; es istscale
. Bitte sehen Sie docs.oracle.com/javase/7/docs/api/java/math/…Weil Sie keine Genauigkeit und keinen Rundungsmodus angeben. BigDecimal beschwert sich darüber, dass es 10, 20, 5000 oder unendlich viele Dezimalstellen verwenden könnte, und es wäre immer noch nicht in der Lage, Ihnen eine genaue Darstellung der Zahl zu geben. Anstatt dir also ein falsches BigDecimal zu geben, pfeift es dich nur an.
Wenn Sie jedoch einen RoundingMode und eine Präzision angeben, kann dieser konvertiert werden (z. B. 1.333333333-to-Infinity in etwa 1.3333 ... aber Sie als Programmierer müssen angeben, mit welcher Präzision Sie zufrieden sind '.
quelle
Du kannst tun
Sie können die Anzahl der gewünschten Bits zwischen 32,64,128 wählen.
Schauen Sie sich diesen Link an:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
quelle
Um ein solches Problem zu beheben, habe ich den folgenden Code verwendet
2 ist Präzision. Jetzt wurde das Problem behoben.
quelle
precision
; es istscale
. Bitte sehen Sie docs.oracle.com/javase/7/docs/api/java/math/…Ich hatte das gleiche Problem, weil meine Codezeile war:
Ich ändere dies, indem ich die vorherige Antwort lese, weil ich keine Dezimalgenauigkeit geschrieben habe:
4 ist Dezimalpräzision
AND RoundingMode sind Enum-Konstanten. Sie können eine dieser Konstanten auswählen
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
In diesem Fall hat HALF_UP folgendes Ergebnis:
Sie können die
RoundingMode
Informationen hier überprüfen : http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/quelle
Es geht darum, das Ergebnis abzurunden. Die Lösung für mich ist die folgende.
quelle
Antwort für BigDecimal löst ArithmeticException aus
Fügen Sie Ihrem Divide-Methodenaufruf ein MathContext-Objekt hinzu und passen Sie die Genauigkeit und den Rundungsmodus an. Dies sollte Ihr Problem beheben
quelle
Ihr Programm weiß nicht, welche Genauigkeit für Dezimalzahlen verwendet werden soll, daher wird Folgendes ausgelöst:
Lösung zur Umgehung der Ausnahme:
quelle