588 votes

ArithmeticException : « terminaison Non développement décimal ; aucun résultat décimal représentable exactement »

Pourquoi le code suivant déclenche l’exception ci-dessous ?

--

975voto

DVK Points 63282

À partir de la docs:

Lorsqu'un MathContext objet est fourni avec une précision de réglage de 0 (pour exemple, MathContext.ILLIMITÉ), les opérations arithmétiques sont exacts, comme sont les méthodes arithmétiques qui ne permet pas de MathContext objet. (C'est le seul comportement qui a été pris en charge dans les versions antérieures à 5.)

En tant que corollaire du calcul du résultat exact, le mode d'arrondi fixation d'un MathContext objet avec une précision de réglage de 0 n'est pas utilisé et donc hors de propos. Dans le cas de la fracture, le quotient exact pourrait avoir un infiniment longue décimal l'expansion; par exemple, 1 divisé par 3.

Si le quotient a un nonterminating décimal expansion et le fonctionnement est spécifié pour retourner un résultat exact, une ArithmeticException est levée. Sinon, le résultat exact de la division est de retour, comme fait pour d'autres opérations.

Pour le fixer, vous avez besoin de faire quelque chose comme ceci:

a.divide(b, 2, RoundingMode.HALF_UP)

where 2 is precision and RoundingMode.HALF_UP is rounding mode

Plus de détails: http://jaydeepm.wordpress.com/2009/06/04/bigdecimal-and-non-terminating-decimal-expansion-error/

84voto

David Bullock Points 2120

Parce que vous n'êtes pas la spécification d'une précision et un arrondi-mode. BigDecimal, on se plaint qu'il pourrait utiliser 10, 20, 5000, ou l'infini de décimales, et ce ne serait pas encore en mesure de vous donner une représentation exacte du nombre. Donc au lieu de vous donner une mauvaise BigDecimal, c'est juste whinges à vous.

Cependant, si vous fournissez un RoundingMode et de précision, il sera en mesure de convertir (par exemple. 1.333333333-de-l'infini à quelque chose comme 1.3333 ... mais vous en tant que programmeur besoin de lui dire quelle précision vous êtes heureux avec'.

72voto

MindBrain Points 733

Vous pouvez faire

Vous pouvez choisir le nombre de bits vous voulez soit 32,64,128.

Consultez ce lien :

http://Edelstein.Pebbles.cs.CMU.edu/Jadeite/main.php?API=java6&State=Class&package=java.Math&Class=MathContext

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X