Si vous utilisez double
ou float
, vous devez utiliser l'arrondissement ou de s'attendre à voir des erreurs d'arrondi. Si vous ne pouvez pas faire cela, utilisez BigDecimal
.
Le problème que vous avez est que de 0,1 n'est pas une représentation exacte, et en effectuant le calcul deux fois, vous êtes aggravé son erreur.
Cependant, à 100 peuvent être représentés avec précision, alors essayez de:
double x = 1234;
x /= 100;
System.out.println(x);
qui affiche:
12.34
Cela fonctionne parce qu' Double.toString(d)
effectue une petite quantité de l'arrondissement sur votre nom, mais il n'est pas beaucoup. Si vous vous demandez à quoi ça pourrait ressembler, sans arrondi:
System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));
impressions:
0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375
En bref, l'arrondi est inévitable pour des réponses intelligentes à virgule flottante de savoir si vous faites cela de manière explicite ou non.
Remarque: x / 100
et x * 0.01
ne sont pas exactement les mêmes quand il s'agit de l'erreur d'arrondi. C'est parce que le tour d'erreur pour la première expression dépend des valeurs de x, alors que l' 0.01
dans le second, un fixe ronde erreur.
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);
}
imprime
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