BigDecimal setScale and round


140

Qual è la differenza tra queste due chiamate? (C'è qualche?)

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

6
a parte le risposte accettate di seguito - setScale () crea un nuovo oggetto di BigDecimal - data la sua immutabile classe
prash

9
@prash il roundmetodo restituisce anche una nuova istanza di BigDecimal perché, come hai detto, le istanze sono immutabili.
daiscog,

Risposte:


212

Un punto importante a cui si allude ma non direttamente affrontato è la differenza tra "precisione" e "scala" e il modo in cui vengono utilizzati nelle due affermazioni. "precisione" è il numero totale di cifre significative in un numero. "scala" è il numero di cifre a destra del punto decimale.

Il costruttore MathContext accetta solo precisione e RoundingMode come argomenti, e quindi la scala non viene mai specificata nella prima istruzione.

setScale() accetta ovviamente scale come argomento, così come RoundingMode, tuttavia la precisione non è mai specificata nella seconda istruzione.

Se sposti il ​​punto decimale di una posizione verso destra, la differenza diventerà chiara:

// 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
Ri: "" precisione "è il numero totale di cifre in un numero." No. La precisione è il numero di cifre significative. La precisione di 0.000042M è 2.
David J.

2
Vedi: "precisione": il conteggio delle cifre inizia dalla cifra non zero più a sinistra del risultato esatto. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

se "La precisione è il numero di cifre significative" rispetto al motivo per cui la precisione di 0,0000009 è pari a 2? dovrebbe essere 1
Sanchi Girotra,

1
Come viene impostato il valore di BigDecimal? In che modo stai producendo il valore (l'utilizzo di String.format () potrebbe nascondere cifre significative)?
Dale Peters,

1
@SanchiGirotra La precisione è "il numero di cifre nel valore non scalato". Una precisione di 2 con un valore non scalato di 90 e una scala di 8 fornisce 0,0000009. Come una precisione di 1, valore non scalato di 9 e una scala di 7.
daiscog

52

C'è davvero una grande differenza, che dovresti tenere a mente. setScale imposta davvero la scala del tuo numero mentre round fa arrotondare il tuo numero alle cifre specificate MA "inizia dalla cifra più a sinistra del risultato esatto" come indicato all'interno del jdk. Quindi per quanto riguarda il tuo campione i risultati sono gli stessi, ma prova invece 0,0034. Ecco la mia nota a riguardo sul mio blog:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.