2015-09-13 23 views
6

Voglio sottrarre 2 valori double e ho provato il seguente codice.BigDecimal Sottrazione

double val1 = 2.0; 
double val2 = 1.10; 

System.out.println(val1 - val2); 

e ho avuto l'output come,

0.8999999999999999 

Per ottenere output come 0.9 ho provato con BigDecimal come segue,

BigDecimal val1BD = new BigDecimal(val1); 
BigDecimal val2BD = new BigDecimal(val2); 

System.out.println(val1BD.subtract(val2BD)); 

E ho avuto l'output come,

0.899999999999999911182158029987476766109466552734375 

poi ho provato con BigDecimal.valueOf()

val1BD = BigDecimal.valueOf(val1); 
val2BD = BigDecimal.valueOf(val2); 

System.out.println(val1BD.subtract(val2BD)); 

E finalmente ho avuto l'output come 0.9.

La mia domanda è qual è la differenza tra il caso 2 & caso 3?

Nel caso 2 perché ho ottenuto l'output in questo modo?

risposta

6

BigDecimal.valueOf(double d) utilizza canonico String rappresentazione di doppio valore, internamente Double.toString(double) viene utilizzato, è per questo che si ottiene 0.9 nel secondo caso.

Nota: Questo è generalmente il modo migliore per convertire un doppio (o float) in un BigDecimal, come il valore restituito è uguale a quello risultante dalla costruzione di un BigDecimal dal risultato dell'utilizzo Double.toString(double) .

Mentre con new BigDecimal(0.9) converte valore di esigere punto rappresentazione double flottante senza utilizzare String rappresentazione,

traduce un letto in una BigDecimal che è l'esatto decimale rappresentazione binaria della doppia valore in virgola mobile.

...

NOTE:

  1. I risultati di questo costruttore può essere un po 'imprevedibile.

...

PER ESEMPIO:

BigDecimal bd1 = new BigDecimal(Double.toString(0.9)); 
BigDecimal bd2 = new BigDecimal(0.9); 
System.out.println(bd1); 
System.out.println(bd2); 

USCITA:

0.9 
0.90000000000000002220446049250313080847263336181640625 
+2

Forse vale la pena di ricordare che il modo migliore per inizializzare un 'BigDecimal' è da un' STRING' o 'char []'. Una volta che hai un doppio errore, è già stato fatto un errore di arrotondamento. La conversione di un 'String' può o non può annullare quell'errore. Matematicamente, il doppio valore esatto è la scelta migliore se si è interessati alla precisione. – Henry