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!