2012-03-29 5 views
6

Я не могу найти, почему у меня есть java.lang.ArithmeticException: Invalid operation при использовании большого десятичного знака.java BigDecimal arithmaticException недействительная операция

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

Некоторые из показателей имеют такие значения, как -27. Есть ли способ обойти это, поскольку было бы трудно сохранить исходные значения со многими нулями. Я выбрал BigDecimal, так как мне нужно было точно.

Спасибо

ответ

4

Если вы поднимаете вещи отрицательных показателей, необходимо указать в BigDecimal.pow(int, MathContext)MathContext поэтому он знает, сколько точности использования - в противном случае, BigDecimal попытается вычислить его бесконечную точность, которая невозможно для некоторых значений.

(Если вы не можете быть абсолютно уверены, что операция вы делаете имеет точный результат с конечным числом цифр.)

+0

Я абсолютно уверен, что у него нет бесконечной точности. Я все еще получаю эту ошибку. Использование double не дойдет до тех пор, пока некоторые выполняемые операции, как правило, выполняются около 0. Я не вижу, как 10 от выключения может быть бесконечной точностью, а научный калькулятор может поддерживать значение до -99. В противном случае был бы лучший способ представить это? –

+0

Не могли бы вы дать нам трассировку стека исключения? –

+1

@ErrorMessages 'pow (int)' будет, при заданном отрицательном числе, бросить исключение ArithmeticException. Всегда. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#pow%28int%29 – Joni

2

Чтобы умножить BigDecimal на степень 10, это, вероятно, понятнее к читатель (и более эффективным, тоже), чтобы использовать movePointLeft и movePointRight:

Вместо tempValue.multiply(ten.pow(exponent)) вы бы использовать tempValue.movePointRight(exponent).