Le problème que vous avez est que 0,1 est représenté avec un nombre légèrement plus élevé, par ex.
System.out.println(new BigDecimal(0.1));
impressions
0.1000000000000000055511151231257827021181583404541015625
Le Double.toString() prend en compte cette erreur de représentation pour que vous ne la voyiez pas.
De même 0,3 est représenté par une valeur légèrement inférieure à ce qu'elle est réellement.
0.299999999999999988897769753748434595763683319091796875
Si vous multipliez la valeur représentée de 0,1 par 3 vous ne recevez pas la valeur représentée pour 0,3, vous plutôt obtenir quelque chose d'un peu plus
0.3000000000000000166533453693773481063544750213623046875
Ce n'est pas seulement une erreur de représentation, mais également une erreur d'arrondi provoquée par les opérations. C'est plus que le Double.toString() corrigera et ainsi vous voyez l'erreur d'arrondi.
La morale de l'histoire, si vous utilisez float
ou double
également autour de la solution de manière appropriée.
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5)/1e6; // round to 6 decimal places.
System.out.println(d2);
impressions
0.30000000000000004
0.3
... Vous n'utilisez pas 'BigDecimal'. Vous faites * exactement la même chose * que d'ajouter les doubles. 'doubleValue()' renvoie ... un double. Voir le Javadoc pour 'BigDecimal' sur comment ajouter/soustraire/etc –
Re les calculs' 'double'', voir [Ce que tout scientifique informatique devrait savoir sur l'arithmétique en virgule flottante] (http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html). Java résout cela en fournissant des options de format pour la sortie. –
Pourquoi utilisez-vous 'doubleValue()' ??? Je pensais que tu voulais un type décimal. –