2017-10-21 77 views
1

Je veux que ma valeur mathématique se casse lorsque la valeur est 0.8. Mais le programme continue et je n'obtiens pas le résultat que je recherche.Java comparant une double valeur égale mais obtenant un mauvais résultat. Le programme ne se termine jamais

double math = 5.0; 

while (true) { 
    if (math == 0.8) { 
     break; 
    } 
    math -= 0.2; 
    System.out.println (math); 
} 
System.out.println ("Your math value is done."); 
+0

Jetez un oeil à cette réponse https://stackoverflow.com/questions/322749/retain-precision-with-double-in-java –

Répondre

1

Vous avez un problème avec une précision en virgule flottante. Si vous exécutez votre code via le débogueur, la valeur calculée n'est probablement pas exactement égale à 0,8, mais quelque chose comme par exemple: 0.79999999999999785

Vous pouvez essayer de définir un seuil dans votre condition afin qu'il casse la boucle. Voici un exemple comment vous pouvez le faire:

double math = 5.0; 

double delta = 0.001; 
while (true) { 

    if (math > 0.8 - delta && math < 0.8 + delta) 
     break; 
    math -= 0.2; 
    System.out.println(math); 
} 
System.out.println("Your math value is done."); 

erreurs de lissage sont une « fonction » de l'arithmétique en virgule flottante dans les ordinateurs. Voir la section sur les erreurs d'arrondi dans ce article.

0

Vérifiez delta entre math et 0.8 pour voir si c'est dans un certain niveau de précision que vous avez défini pour votre programme avant de sortir de la boucle. Utilisez le BigDecimal pour les calculs si vous souhaitez conserver la précision.

if (Math.abs(math - 0.8) < 0.00000001) { 
    break; 
}