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 :