2012-03-29 1 views
6

Je ne peux pas trouver pourquoi j'ai obtenu un java.lang.ArithmeticException: Invalid operation tout en utilisant grand décimal.java BigDecimal arithmaticException opération invalide

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

Certains des exposants ont des valeurs telles que -27. Y at-il un moyen de contourner ce problème, car il serait difficile de stocker les valeurs d'origine avec beaucoup de zéros. J'ai choisi BigDecimal car j'avais besoin de précision.

Merci

Répondre

4

Si vous élevez des choses à des exposants négatifs, vous devez spécifier un MathContext en BigDecimal.pow(int, MathContext) il sait à quel point la précision à utiliser - sinon, BigDecimal va essayer de le calculer avec une précision infinie, qui est pas possible pour certaines valeurs.

(Sauf si vous pouvez être absolument sûr que l'opération que vous faites a un résultat exact avec un nombre fini de chiffres.)

+0

Je suis absolument sûr qu'il n'a pas une précision infinie. J'ai toujours cette erreur cependant. L'utilisation du double n'atteindra pas aussi loin tandis que certaines opérations effectuées tendent à se faire près de 0. Je ne vois pas comment 10 à la mise hors tension quelque chose peut être une précision infinie et une calculatrice scientifique peut maintenir la valeur jusqu'à -99. Sinon, y aurait-il une meilleure façon de représenter cela? –

+0

Pourriez-vous nous donner la trace de la pile de l'exception? –

+1

@ErrorMessages 'pow (int)' donnera, lorsqu'il reçoit un nombre négatif, une exception ArithmeticException. Toujours. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#pow%28int%29 – Joni

2

Pour multiplier BigDecimal par une puissance de 10, il est probablement plus clair à la lecteur (et plus efficace, aussi) à utiliser movePointLeft et movePointRight:

au lieu de tempValue.multiply(ten.pow(exponent)) vous utiliseriez tempValue.movePointRight(exponent).