Comme les réponses précédentes, ce est une conséquence de faire arithmétique à virgule flottante.
Comme une affiche précédente a suggéré, Quand vous faites des calculs numériques, l'utilisation de java.les mathématiques.BigDecimal.
Cependant, il y a une chasse aux sorcières à l'aide de BigDecimal. Lors de la conversion de la valeur de type double pour un BigDecimal, vous avez le choix de l'utilisation d'un new BigDecimal(double), le constructeur ou le BigDecimal.valueOf(double) statique méthode de fabrique. L'utilisation de la statique méthode de fabrique.
Le double constructeur convertit l'ensemble de la précision de la double à un BigDecimal alors que la statique de l'usine efficacement la convertit en une chaîne de caractères, puis la convertit en un BigDecimal.
C'est important lorsque vous êtes en cours d'exécution dans ces subtiles erreurs d'arrondi. Un certain nombre peuvent afficher .585, mais en interne, c'est la valeur est 0.58499999999999996447286321199499070644378662109375'. Si vous avez utilisé le BigDecimal constructeur, vous obtenez le nombre n'est PAS égal à 0.585, tandis que la méthode statique serait de vous donner une valeur égale à 0.585.
double value = 0.585;
System.out.println(new BigDecimal(value));
System.out.println(BigDecimal.valueOf(value));
sur mon système donne
0.58499999999999996447286321199499070644378662109375
0.585