setscale ejemplo declarar java exception bigdecimal

java - ejemplo - ¿Qué causa la excepción "Expansión decimal sin terminación" de BigDecimal.divide?



declarar bigdecimal java (6)

Aquí está el problema

bd1.divide(bd2)

Debe usar uno de los métodos de divide() sobrecargados que toman un modo de redondeo (en varias formas): no puede realizar el redondeo después de la división porque, con una fracción no terminante, el resultado intermedio ya debería estar redondeado, o requerir infinito Espacio de almacenamiento.

He usado BigDecimals antes, pero no muy a menudo, estaba trabajando en algo esta mañana y seguí recibiendo la siguiente excepción:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(BigDecimal.java:1594)

Intenté establecer la escala y utilizar el redondeo para eliminar el problema de esta manera:

BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP); BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP); BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP); System.out.println("result: " + bd3);

Sin embargo, sigo teniendo la misma excepción. ¿Alguien capaz de mostrarme donde he cometido un error?


Cuando use divide , debe usar un MathContext en caso de que el resultado exacto tenga un número infinito de decimales (como es su caso):

MathContext mc = new MathContext(2, RoundingMode.HALF_UP); BigDecimal bd3 = bd1.divide(bd2, mc);

o alternativamente:

BigDecimal bd3 = bd1.divide(bd2, RoundingMode.HALF_UP);


De forma predeterminada, BigDecimal intenta devolver el valor exacto de la expresión de división dada. Debido a esto, si el valor exacto no se puede determinar debido a una expansión decimal infinita, se emite una ArithmeticException. Un ejemplo básico de esto es dividir 1 por 3, lo que resulta en un tercio, un valor que no se puede representar exactamente en notación decimal.


El problema es causado por una operación (división) que resultaría en un decimal recurrente.

La solución es especificar una escala al realizar una división, por ejemplo:

BigDecimal one = new BigDecimal("1"); BigDecimal three = new BigDecimal("3"); BigDecimal oneDivThree = one.divide(three, 200, RoundingMode.HALF_UP);


Para solucionarlo, debes cambiar el tercer estado de la siguiente manera:

BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP); BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP); System.out.println("result: " + bd3);


Usted está recibiendo este error debido a la división:

  1. El BigDecimal por defecto siempre intenta devolver el resultado exacto de una operación.
  2. Debido a esto, ciertas operaciones de división como 1 dividida por 3, el cociente exacto tendrá una expansión decimal infinitamente larga. Esto hará que la operación de división falle y arroje el error como se describe anteriormente.

Proporciona una escala y un modo de redondeo (como lo has hecho al crear los BigDecimals) dentro del método de división para evitar esto.

Tomado de here . También se proporciona código de ejemplo para la división de trabajo.

Véase también: documentos Java en BigDecimal .