La réponse courte; en raison d'une erreur ronde
(double) 111111111111111.11 != (double) 111111111111111.1
mais
(double) 333333333333333.33 == (double) 333333333333333.3
Si vous voulez plus de précision, utilisez setParseBigDecimal et Parse retournera un BigDecimal.
Pourquoi cela? C'est parce que vous êtes à la limite de la précision du double. Les 17 sont bien car ils peuvent être représentés. Le 2 est juste le double et comme double stocke les pouvoirs de deux, chaque puissance de deux de tous les 17, donc 17 fours et 17 huit est bien.
Cependant, 17 trois prend un peu plus que le double doit représenter la valeur et ce dernier bit est tronqué. De même, 17 octets, six et neuf ont également des erreurs d'arrondi.
double[] ds = {
111111111111111.11,
222222222222222.22,
333333333333333.33,
444444444444444.44,
555555555555555.55,
666666666666666.66,
777777777777777.77,
888888888888888.88,
999999999999999.99};
for (double d : ds) {
System.out.println(d + " - " + new BigDecimal(d));
}
affiche les éléments suivants. Le double
est légèrement arrondi avant l'impression et le BigDecimal vous montre les valeurs exactes que le double représente.
1.1111111111111111E14 - 111111111111111.109375
2.2222222222222222E14 - 222222222222222.21875
3.333333333333333E14 - 333333333333333.3125
4.4444444444444444E14 - 444444444444444.4375
5.5555555555555556E14 - 555555555555555.5625
6.666666666666666E14 - 666666666666666.625
7.777777777777778E14 - 777777777777777.75
8.888888888888889E14 - 888888888888888.875
1.0E15 - 1000000000000000
Y a-t-il une solution de contournement pour éviter de doubler mais de laisser trop long? – Mallinok
Un 'long' est un type entier, ainsi vous perdriez la partie fractionnaire (', 33'). – aioobe
@aioobe, Pourriez-vous regarder les documents pour Java 1.4? Cette méthode a été ajoutée en Java 5.0. http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html#setParseBigDecimal%28boolean%29 –