web-dev-qa-db-fra.com

Arrondi nécessaire avec des nombres BigDecimal

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

35
Mehdi

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.

32
brain

Essayez d'utiliser roudingMode de la méthode setScale.

Quelque chose comme:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
14
Akostha

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.

6
Haozhun