2012-05-24 20 views
25

Quiero establecer la escala de dos números BigDecimal a y b. como en este ejemplo:Redondeo necesario con números 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); 

y cuando corro tengo esta excepción:

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) 

¿Por qué es necesario el redondeo? si no quiero ganar, ¿cuál es la solución, por favor?

Gracias

+0

De hecho, es una sorpresa. Sin mirar los documentos, esperaba configurar la escala para truncar en la escala ... –

Respuesta

26

tiene dos números BigDecimal los cuales requieren más de 1000 lugares decimales. Si intenta configurar la escala para que solo tenga 113 lugares decimales, perderá precisión y, por lo tanto, deberá redondear.

Puede usar los métodos setScale que toman un RoundingMode para evitar la excepción pero no el redondeo.

4

Redondeo es necesario.

En javadoc for BigDecimal, se dice BigDecimal se representa como (unscaledValue × 10 -scale), donde unscaledValue es un arbitatrily entero largo y la escala es un entero de 32 bits.

2.6 * 10 -1095 requiere una escala de al menos 1096 para representar con precisión. No se puede representar con precisión con (cualquier número entero) * 10 -113. Por lo tanto, debe proporcionar un roundingMode.

5

Intente utilizar el método roudingMode of setScale.

algo como:

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