setscale round redondear necessary ejemplo decimales java rounding bigdecimal

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);