2010-10-01 10 views
101

Was ist der Unterschied zwischen diesen beiden Anruf? (Gibt es welche?)BigDecimal setScale und rund

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

abgesehen von akzeptierten Antworten unten - setScale() erzeugt ein neues Objekt der BigDecimal - gegeben sein eine unveränderliche Klasse – prash

+4

@ prash Die 'round'-Methode gibt auch eine neue Instanz von BigDecimal zurück, da die Instanzen wie erwähnt unwandelbar sind. – megaflop

Antwort

156

Ein wichtiger Punkt, der erwähnt wird, aber nicht direkt angesprochen wird, ist die Differenz zwischen „Präzision“ und „Skala“ und wie sie verwendet werden in den zwei Aussagen. "Genauigkeit" ist die Gesamtzahl der signifikanten Stellen in einer Zahl. "scale" ist die Anzahl der Stellen rechts vom Dezimalpunkt.

Der MathContext-Konstruktor akzeptiert nur die Genauigkeit und den RoundingMode als Argumente und daher wird die Skalierung niemals in der ersten Anweisung angegeben.

setScale() akzeptiert offensichtlich Skalierung als ein Argument sowie RoundingMode, jedoch wird Genauigkeit nie in der zweiten Anweisung angegeben.

Wenn Sie das Komma um eine Stelle nach rechts zu bewegen, 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 
+26

Re: "" Präzision "ist die Gesamtzahl der Ziffern in einer Zahl." Nein. Präzision ist die Anzahl der signifikanten Stellen. Die Genauigkeit von 0.000042M ist 2. –

+0

Siehe: "Präzision": Die Ziffernzählung beginnt mit der äußersten linken Ziffer ungleich Null des exakten Ergebnisses. https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html – Eddy

+0

Wenn "Präzision ist die Anzahl der signifikanten Ziffern" als warum Genauigkeit von 0,0000009 kommt als 2? Es sollte 1 –

44

Es gibt tatsächlich einen großen Unterschied, den Sie beachten sollten. setScale setzt den Maßstab Ihrer Zahl, während round Ihre Zahl auf die angegebenen Zahlen umsetzt, ABER "beginnt von der ganzzahligen Stelle des exakten Ergebnisses" wie im jdk erwähnt. In Bezug auf Ihre Probe sind die Ergebnisse gleich, aber versuchen Sie stattdessen 0,0034. Hier ist meine Notiz, dass auf meinem Blog:

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