De los documentos de Java 11BigDecimal
:
Cuando MathContext
se suministra un objeto con una configuración de precisión de 0 (por ejemplo, MathContext.UNLIMITED
), las operaciones aritméticas son exactas, al igual que los métodos aritméticos que no toman ningún MathContext
objeto. (Este es el único comportamiento admitido en las versiones anteriores a la 5.)
Como corolario de calcular el resultado exacto, la configuración del modo de redondeo de un MathContext
objeto con una configuración de precisión de 0 no se utiliza y, por lo tanto, es irrelevante. En el caso de dividir, el cociente exacto podría tener una expansión decimal infinitamente larga; por ejemplo, 1 dividido por 3.
Si el cociente tiene una expansión decimal no determinante y la operación se especifica para devolver un resultado exacto, ArithmeticException
se arroja un. De lo contrario, se devuelve el resultado exacto de la división, como se hizo para otras operaciones.
Para solucionarlo, debe hacer algo como esto :
a.divide(b, 2, RoundingMode.HALF_UP)
donde 2 es la escala y RoundingMode.HALF_UP es el modo de redondeo
Para más detalles vea esta publicación de blog .
precision
; esscale
. Consulte docs.oracle.com/javase/7/docs/api/java/math/…Porque no estás especificando una precisión y un modo de redondeo. BigDecimal se queja de que podría usar 10, 20, 5000 o infinitos decimales, y aún así no podría darle una representación exacta del número. Entonces, en lugar de darle un BigDecimal incorrecto, simplemente se queja.
Sin embargo, si proporciona un RoundingMode y una precisión, entonces podrá convertir (por ejemplo, 1.333333333 al infinito en algo así como 1.3333 ... pero usted como programador necesita decirle con qué precisión está 'contento' '.
fuente
Tu puedes hacer
Puede elegir la cantidad de bits que desea, ya sea 32,64,128.
Mira este enlace:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
fuente
Para solucionar este problema, he usado el siguiente código
2 es precisión. Ahora el problema fue resuelto.
fuente
precision
; esscale
. Consulte docs.oracle.com/javase/7/docs/api/java/math/…Tuve este mismo problema, porque mi línea de código era:
Me cambio a esto, leyendo la respuesta anterior, porque no estaba escribiendo precisión decimal:
4 es precisión decimal
Y RoundingMode son constantes Enum, puede elegir cualquiera de estos
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
En este caso HALF_UP, tendrá este resultado:
Puede consultar la
RoundingMode
información aquí: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/fuente
Se trata de redondear el resultado, la solución para mí es la siguiente.
fuente
Respuesta para BigDecimal lanza ArithmeticException
Agregue el objeto MathContext en su llamada al método de división y ajuste la precisión y el modo de redondeo. Esto debería solucionar tu problema
fuente
Su programa no sabe qué precisión utilizar para los números decimales, por lo que arroja:
Solución para evitar la excepción:
fuente