Je veux définir l'échelle de deux nombres BigDecimal a
et b
. comme dans cet exemple:
BigDecimal a = new BigDecimal("2.6E-1095");
BigDecimal b = new BigDecimal("2.7E-1105");
int i = 112, j=1;
BigDecimal aa = a.setScale(i+j);
BigDecimal bb = b.setScale(i+j);
et quand je cours j'ai cette exception:
Java.lang.ArithmeticException: Rounding necessary
at Java.math.BigDecimal.divideAndRound(BigDecimal.Java:1439)
at Java.math.BigDecimal.setScale(BigDecimal.Java:2394)
at Java.math.BigDecimal.setScale(BigDecimal.Java:2437)
Pourquoi l'arrondi est-il nécessaire? si je ne veux pas faire le tour, quelle est la solution s'il vous plait?
Merci
Vous avez deux nombres BigDecimal qui nécessitent tous deux plus de 1000 décimales. Essayer de régler l'échelle pour qu'elle ne contienne que 113 décimales signifie que vous perdrez de la précision et que vous devrez donc arrondir.
Vous pouvez utiliser les méthodes setScale qui prennent un RoundingMode pour empêcher l'exception mais pas l'arrondi.
Essayez d'utiliser roudingMode de la méthode setScale.
Quelque chose comme:
BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
L'arrondi est nécessaire.
Dans javadoc pour BigDecimal , il indique que BigDecimal
est représenté par (unscaledValue × 10-échelle), où unscaledValue
est un entier arbitrairement long et l'échelle est un entier 32 bits.
2,6 * 10-1095 nécessite une échelle d'au moins 1096 pour représenter avec précision. Il ne peut pas être représenté avec précision avec (n'importe quel entier) * 10-113. Par conséquent, vous devez fournir un roundingMode
.