java - round - redondear bigdecimal 2 decimales
Redondeo necesario con nĂºmeros BigDecimal (3)
Quiero establecer la escala de dos números BigDecimal a
y b
. como en este ejemplo:
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 dar una vuelta, ¿cuál es la solución por favor?
Gracias
El redondeo es necesario.
En javadoc para BigDecimal , dice que BigDecimal
se representa como ( escala sin escalar × 10), donde unscaledValue
es un entero de arbitraje 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 (ningún entero) * 10 -113 . Por lo tanto, es necesario proporcionar un roundingMode
.
Tienes dos números BigDecimal que requieren más de 1000 decimales. Si intenta establecer la escala para que tenga solo 113 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.
Trate de usar roudingMode del método setScale.
Algo como:
BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);