BigDecimal setScale und rund


140

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);

6
Abgesehen von den unten akzeptierten Antworten erstellt setScale () ein neues Objekt von BigDecimal - angesichts seiner unveränderlichen Klasse
Prash

9
@prash Die roundMethode gibt auch eine neue Instanz von BigDecimal zurück, da die Instanzen, wie Sie sagten, unveränderlich sind.
Daiscog

Antworten:


212

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:

// 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

38
Betreff: "" Genauigkeit "ist die Gesamtzahl der Ziffern in einer Zahl." Präzision ist die Anzahl der signifikanten Stellen. Die Genauigkeit von 0,000042M beträgt 2.
David J.

2
Siehe: "Genauigkeit": Die Ziffernanzahl beginnt bei der Ziffer ganz links ungleich Null des genauen Ergebnisses. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

Wenn "Genauigkeit ist die Anzahl der signifikanten Stellen", warum wird dann eine Genauigkeit von 0,0000009 als 2 angegeben? es sollte 1 sein
Sanchi Girotra

1
Wie wird der Wert Ihres BigDecimal festgelegt? Wie geben Sie den Wert aus (mit einem String.format () können möglicherweise signifikante Ziffern ausgeblendet werden)?
Dale Peters

1
@SanchiGirotra Die Genauigkeit ist "die Anzahl der Stellen im nicht skalierten Wert". Eine Genauigkeit von 2 mit einem nicht skalierten Wert von 90 und einer Skala von 8 ergibt 0,0000009. Ebenso wie eine Genauigkeit von 1, ein nicht skalierter Wert von 9 und eine Skala von 7.
Daiscog

52

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.