Si vous utilisez double
ou float
, vous devez utiliser l'arrondi ou vous attendre à voir des erreurs d'arrondi. Si vous ne pouvez pas faire cela, utilisez BigDecimal
.
Le problème que vous avez est que 0,1 n'est pas une représentation exacte, et en effectuant le calcul deux fois, vous ajoutez cette erreur.
Cependant, 100 peuvent être représentés avec précision, alors essayez:
double x = 1234;
x /= 100;
System.out.println(x);
qui imprime:
12.34
Cela fonctionne car Double.toString(d)
effectue un petit nombre d'arrondis en votre nom, mais ce n'est pas beaucoup. Si vous vous demandez à quoi cela pourrait ressembler sans arrondir:
System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));
imprime:
0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375
En bref, l'arrondi est inévitable pour les réponses sensées en virgule flottante, que vous le fassiez explicitement ou non.
Remarque: x / 100
et x * 0.01
ne sont pas exactement les mêmes en matière d'erreur d'arrondi. En effet, l'erreur d'arrondi pour la première expression dépend des valeurs de x, tandis que 0.01
dans la seconde a une erreur d'arrondi fixe.
for(int i=0;i<200;i++) {
double d1 = (double) i / 100;
double d2 = i * 0.01;
if (d1 != d2)
System.out.println(d1 + " != "+d2);
}
impressions
0.35 != 0.35000000000000003
0.41 != 0.41000000000000003
0.47 != 0.47000000000000003
0.57 != 0.5700000000000001
0.69 != 0.6900000000000001
0.7 != 0.7000000000000001
0.82 != 0.8200000000000001
0.83 != 0.8300000000000001
0.94 != 0.9400000000000001
0.95 != 0.9500000000000001
1.13 != 1.1300000000000001
1.14 != 1.1400000000000001
1.15 != 1.1500000000000001
1.38 != 1.3800000000000001
1.39 != 1.3900000000000001
1.4 != 1.4000000000000001
1.63 != 1.6300000000000001
1.64 != 1.6400000000000001
1.65 != 1.6500000000000001
1.66 != 1.6600000000000001
1.88 != 1.8800000000000001
1.89 != 1.8900000000000001
1.9 != 1.9000000000000001
1.91 != 1.9100000000000001