Calcul avec BigDecimal

Dans un l’article sur float et double, nous avions vu qu’une suite de calculs assez simples, mais avec des valeurs initiales bien choisies, pouvait aboutir à des résultats étonnants. Pour avoir de meilleurs résultats, il est préférable d’utiliser la classe java.math.BigDecimal.

BigDecimal / double

Le calcul divergeant avec double était le suivant :

 double b = 4095.1;
 double a = b + 1;
 double x = 1;

 for (int index = 1; index <= 9; index++) {
   x = (a * x) - b;
   System.out.printf("%01d => %.6f\n", index, x);
 }

Avec des BigDecimal, cela donnerait ceci :

 BigDecimal b = new BigDecimal(4095.1);
 BigDecimal a = b.add(new BigDecimal(1));
 BigDecimal x = new BigDecimal(1);

 for (int index = 1; index <= 9; index++) {
   x.multiply(a).subtract(b);
   System.out.printf("%01d => %.6f\n", index, x);
 }

Le résultat du calcul ne diverge plus du tout :

 1 => 1,000000
 2 => 1,000000
 ...
 9 => 1,000000
 ...
 999 => 1,000000

Calculs avec BigDecimal

Par contre, les possibilités de calcul sont plus réduites avec BigDecimal, car la classe java.util.Math ne supporte pas ce type. Pour les calculs élémentaires, les méthodes sont directement dans BigDecimal :

Des méthodes de calculs un peu plus complexes sont aussi présents :

  • abs pour la valeur absolue

  • min et max

  • pow élève la valeur à une certaine puissance

  • pow calcule la racine carrée