2012-03-29 23 views
6

No puedo encontrar por qué obtuve un java.lang.ArithmeticException: Invalid operation mientras uso un gran decimal.java BigDecimal arithmaticException operación no válida

public static String E (int exponent, String value){ 
BigDecimal ten= new BigDecimal("10"); 
BigDecimal tempValue=new BigDecimal (value); 
return tempValue.multiply(ten.pow(exponent)).toString(); 
} 

Algunos de los exponentes tienen valores como -27. ¿Hay alguna forma de evitar esto, ya que sería difícil almacenar los valores originales con muchos ceros. Elegí BigDecimal ya que necesitaba precisión.

Gracias

Respuesta

4

Si usted está criando cosas a los exponentes negativos, se debe especificar un MathContext en BigDecimal.pow(int, MathContext) por lo que sabe cuánta precisión de usar - de lo contrario, BigDecimal intentará calcular a precisión infinita, que es no es posible para algunos valores.

(A menos que pueda ser absolutamente seguro que la operación que está haciendo tiene un resultado exacto con un número finito de dígitos.)

+0

estoy absolutamente seguro de que no tiene una precisión infinita. Todavía consigo ese error. Usar double no llegará tan lejos, mientras que algunas operaciones realizadas tienden a realizarse cerca de 0. No veo cómo 10 para apagar algo puede ser una precisión infinita y una calculadora científica puede mantener el valor hasta -99. De lo contrario, ¿habría una mejor manera de representar esto? –

+0

¿Podría darnos el rastro de la pila de la excepción? –

+1

@ErrorMessages 'pow (int)' arrojará, cuando se le dé un número negativo, una ArithmeticException. Siempre. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#pow%28int%29 – Joni

2

Para multiplicar un BigDecimal por una potencia de 10 es probablemente más clara a la lector (y más eficiente, también) para utilizar movePointLeft y movePointRight:

en lugar de tempValue.multiply(ten.pow(exponent)) que usaría tempValue.movePointRight(exponent).

Cuestiones relacionadas