2012-03-29 26 views
6

Ich kann nicht finden, warum ich eine java.lang.ArithmeticException: Invalid operation während der Verwendung großer Dezimalstelle bekam.java BigDecimal arithmaticException ungültige Operation

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

Einige der Exponenten haben Werte wie -27. Gibt es einen Weg dazu, da es schwierig wäre, die ursprünglichen Werte mit vielen Nullen zu speichern. Ich wählte BigDecimal, da ich Präzision brauchte.

Danke

Antwort

4

Wenn Sie die Dinge zu negativen Exponenten heben können, müssen Sie MathContext in BigDecimal.pow(int, MathContext) angeben, so weiß er, wie viel Präzision zu verwenden, um - sonst BigDecimal werden versuchen, es zu unendlicher Genauigkeit zu berechnen, das ist Für einige Werte nicht möglich.

(Es sei denn, Sie absolut sicher sein können, dass die Operation Dich mit einer endlichen Anzahl von Stellen hat ein exaktes Ergebnis zu tun.)

+0

Ich bin mir absolut sicher, dass es keine unendliche Genauigkeit hat. Ich bekomme diesen Fehler trotzdem. Die Verwendung von double wird nicht so weit reichen, während einige Operationen in der Nähe von 0 durchgeführt werden. Ich sehe nicht, wie 10 bis zur Ausschaltung etwas eine unendliche Präzision sein kann und ein wissenschaftlicher Rechner den Wert bis -99 halten kann. Gibt es sonst eine bessere Möglichkeit, dies darzustellen? –

+0

Können Sie uns die Stack-Trace der Ausnahme geben? –

+1

@ErrorMessages 'pow (int)' wird, wenn eine negative Zahl angegeben wird, eine ArithmeticException auslösen. Immer. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#pow%28int%29 – Joni

2

Um eine BigDecimal mit einer Leistung von 10 zu multiplizieren ist es wahrscheinlich klarer die Leser (und auch effizienter) zu verwenden movePointLeft und movePointRight:

Anstelle von tempValue.multiply(ten.pow(exponent)) würden Sie tempValue.movePointRight(exponent) verwenden.

Verwandte Themen