Was ist der Unterschied zwischen diesen beiden Anrufen? (Gibt es irgendwelche?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
java
bigdecimal
Benutzer
quelle
quelle
round
Methode gibt auch eine neue Instanz von BigDecimal zurück, da die Instanzen, wie Sie sagten, unveränderlich sind.Antworten:
Ein wichtiger Punkt, der angedeutet, aber nicht direkt angesprochen wird, ist der Unterschied zwischen "Präzision" und "Skalierung" und wie sie in den beiden Aussagen verwendet werden. "Genauigkeit" ist die Gesamtzahl der signifikanten Stellen in einer Zahl. "scale" ist die Anzahl der Stellen rechts vom Dezimalpunkt.
Der MathContext-Konstruktor akzeptiert nur Präzision und RoundingMode als Argumente. Daher wird in der ersten Anweisung niemals die Skalierung angegeben.
setScale()
akzeptiert offensichtlich die Skalierung als Argument sowie RoundingMode, jedoch wird in der zweiten Anweisung niemals die Genauigkeit angegeben.Wenn Sie den Dezimalpunkt um eine Stelle nach rechts verschieben, wird der Unterschied deutlich:
quelle
Es gibt in der Tat einen großen Unterschied, den Sie beachten sollten. setScale setzt wirklich die Skala Ihrer Nummer, während round Ihre Nummer auf die angegebenen Ziffern rundet, ABER es "beginnt mit der am weitesten links stehenden Ziffer des exakten Ergebnisses", wie im JDK erwähnt. In Bezug auf Ihre Stichprobe sind die Ergebnisse also gleich, aber versuchen Sie stattdessen 0,0034. Hier ist mein Hinweis dazu in meinem Blog:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
quelle