Des Java 11 BigDecimal
docs :
Lorsqu'un MathContext
objet est fourni avec un paramètre de précision de 0 (par exemple, MathContext.UNLIMITED
), les opérations arithmétiques sont exactes, tout comme les méthodes arithmétiques qui ne prennent aucun MathContext
objet. (Il s'agit du seul comportement pris en charge dans les versions antérieures à 5.)
Comme corollaire du calcul du résultat exact, le réglage du mode d'arrondi d'un MathContext
objet avec un réglage de précision de 0 n'est pas utilisé et n'est donc pas pertinent. Dans le cas de la division, le quotient exact pourrait avoir une expansion décimale infiniment longue; par exemple, 1 divisé par 3.
Si le quotient a une expansion décimale non terminale et que l'opération est spécifiée pour renvoyer un résultat exact, un ArithmeticException
est levé. Sinon, le résultat exact de la division est renvoyé, comme pour les autres opérations.
Pour résoudre ce problème, vous devez faire quelque chose comme ceci :
a.divide(b, 2, RoundingMode.HALF_UP)
où 2 est l'échelle et RoundingMode.HALF_UP est le mode d'arrondi
Pour plus de détails, consultez cet article de blog .
precision
; c'estscale
. Veuillez consulter docs.oracle.com/javase/7/docs/api/java/math/…Parce que vous ne spécifiez pas une précision et un mode d'arrondi. BigDecimal se plaint qu'il pourrait utiliser 10, 20, 5000 ou décimales à l'infini, et il ne serait toujours pas en mesure de vous donner une représentation exacte du nombre. Ainsi, au lieu de vous donner un BigDecimal incorrect, il se contente de vous gémir.
Cependant, si vous fournissez un RoundingMode et une précision, il sera capable de convertir (par exemple, 1.333333333-à-infini en quelque chose comme 1.3333 ... mais vous, en tant que programmeur, devez lui dire avec quelle précision vous êtes satisfait '.
la source
Tu peux faire
Vous pouvez choisir le nombre de bits que 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
la source
Pour résoudre un tel problème, j'ai utilisé le code ci-dessous
2 est la précision. Maintenant, le problème a été résolu.
la source
precision
; c'estscale
. Veuillez consulter docs.oracle.com/javase/7/docs/api/java/math/…J'ai eu ce même problème, car ma ligne de code était:
Je passe à ceci, en lisant la réponse précédente, car je n'écrivais pas la précision décimale:
4 est Precison Decimal
ET RoundingMode sont des constantes Enum, vous pouvez choisir l'une de ces options
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
Dans ce cas HALF_UP, aura ce résultat:
Vous pouvez vérifier les
RoundingMode
informations ici: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/la source
C'est une question d'arrondir le résultat, la solution pour moi est la suivante.
la source
Réponse pour BigDecimal lève ArithmeticException
Ajoutez un objet MathContext dans votre appel de méthode de division et ajustez la précision et le mode d'arrondi. Cela devrait résoudre votre problème
la source
Votre programme ne sait pas quelle précision utiliser les nombres décimaux, il lance donc:
Solution pour contourner l'exception:
la source