2012-05-24 17 views
25

Desidero impostare la scala di due numeri BigDecimal a e b. come in questo esempio:Arrotondamento necessario con numeri BigDecimal

BigDecimal a = new BigDecimal("2.6E-1095"); 
     BigDecimal b = new BigDecimal("2.7E-1105"); 
     int i = 112, j=1; 

     BigDecimal aa = a.setScale(i+j); 
     BigDecimal bb = b.setScale(i+j); 

e quando corro ho questa eccezione:

java.lang.ArithmeticException: Rounding necessary 
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2394) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2437) 

Perché arrotondamento è necessaria? se non voglio fare un giro, qual è la soluzione per favore?

Grazie

+0

In effetti si tratta di una sorpresa. Mi sono aspettato di impostare la scala per troncare alla scala ... –

risposta

26

Si hanno due numeri BigDecimal entrambi i quali richiedono oltre 1000 cifre decimali. Cercare di impostare la scala per avere solo 113 posizioni decimali significa perdere la precisione e quindi è necessario arrotondare.

È possibile utilizzare i metodi setScale che eseguono una RoundingMode per impedire l'eccezione ma non l'arrotondamento.

4

L'arrotondamento è necessario.

In javadoc for BigDecimal, si dice BigDecimal è rappresentato come (unscaledValue × 10 -scale), dove unscaledValue è un intero arbitatrily lunga e la scala è un numero intero di 32 bit.

2.6 * 10 -1095 richiede una scala di almeno 1096 per rappresentare con precisione. Non può essere rappresentato con precisione con (qualsiasi numero intero) * 10 -113. Pertanto, è necessario fornire un numero roundingMode.

5

Provare a utilizzare roudingMode del metodo setScale.

qualche cosa come:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);