175 Stimmen

BigDecimal setScale und Runden

Was ist der Unterschied zwischen diesen beiden Anrufen? (Gibt es einen?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

266voto

dale peters Punkte 2730

Ein wichtiger Punkt, der zwar angedeutet, aber nicht direkt angesprochen wird, ist der Unterschied zwischen "Präzision" y "Skala" und wie sie in den beiden Aussagen verwendet werden. "Präzision" ist die Gesamtzahl der signifikanten Ziffern einer Zahl. "Skala" ist die Anzahl der Ziffern rechts vom Dezimalkomma.

Der MathContext-Konstruktor akzeptiert nur precision und RoundingMode als Argumente, so dass scale in der ersten Anweisung nie angegeben wird.

setScale() akzeptiert natürlich scale als Argument, ebenso wie RoundingMode, aber precision wird in der zweiten Anweisung nie angegeben.

Wenn Sie den Dezimalpunkt um eine Stelle nach rechts verschieben, wird der Unterschied deutlich:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

54voto

user817756 Punkte 549

Es gibt in der Tat einen großen Unterschied, den Sie im Auge behalten sollten. setScale setzt wirklich die Skala Ihrer Zahl, während round Ihre Zahl auf die angegebenen Ziffern rundet, ABER es "beginnt mit der ganz linken Ziffer des exakten Ergebnisses", wie im JDK erwähnt. In Bezug auf Ihr Beispiel sind die Ergebnisse also die gleichen, aber versuchen Sie stattdessen 0,0034. Hier ist meine Anmerkung dazu in meinem Blog:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X