Maison  >  Article  >  Java  >  Pourquoi la division « BigDecimal » lance-t-elle une « ArithmeticException » pour les décimales non terminales ?

Pourquoi la division « BigDecimal » lance-t-elle une « ArithmeticException » pour les décimales non terminales ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-12 14:02:01904parcourir

Why Does `BigDecimal` Division Throw an `ArithmeticException` for Non-Terminating Decimals?

Plonger dans les profondeurs de l'ArithmeticException : division sans fin

L'extrait de code fournissait des tentatives de division de deux objets BigDecimal (a et b ). Cependant, cette opération entraîne l'exception suivante :

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

Pour démêler cette exception, nous devons nous plonger dans les détails complexes de l'arithmétique BigDecimal.

L'essence de l'arithmétique exacte

L'essence de l'arithmétique exacte

Comme indiqué dans la documentation Java 11 BigDecimal, lorsque l'objet MathContext la précision est définie sur 0 (par exemple, MathContext.UNLIMITED), les opérations arithmétiques (y compris la division sans MathContext) donnent des résultats exacts. C'était le seul comportement dans les versions antérieures à la version 5.

Expansion décimale infinie et précision

En raison du calcul des résultats exacts, le paramètre de mode d'arrondi d'un objet MathContext avec la précision 0, cela n'a plus d'importance. Pour l'opération de division, le quotient peut avoir une expansion décimale infinie, telle que 1 divisé par 3.

Gestion des expansions non terminales

Si le quotient a une expansion non terminale -terminant l'expansion décimale et que l'opération est requise pour renvoyer un résultat exact, une ArithmeticException est levée. À l'inverse, le quotient exact est renvoyé si le résultat est fini.

Solution pour les divisions non terminales

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

Pour remédier à ce problème, vous pouvez utiliser une méthode comme celle-ci :

Ici, 2 représente l'échelle, et RoundingMode.HALF_UP précise l'arrondi méthode.

Ressources supplémentaires

Pour une compréhension approfondie, reportez-vous à la documentation Java 11 BigDecimal et à cet article de blog perspicace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn