double r = 11.631;
double theta = 21.4;
Dans le débogueur, ils sont affichés sous forme de 11.631000000000000
et 21.399999618530273
.
Comment puis-je éviter ça?
double r = 11.631;
double theta = 21.4;
Dans le débogueur, ils sont affichés sous forme de 11.631000000000000
et 21.399999618530273
.
Comment puis-je éviter ça?
Ces problèmes de précision sont dus à la représentation interne des nombres en virgule flottante et vous ne pouvez pas faire grand chose pour les éviter.
En passant, l’impression de ces valeurs au moment de l’exécution permet souvent d’obtenir les bons résultats, du moins avec les compilateurs C ++ modernes. Pour la plupart des opérations, ce n'est pas vraiment un problème.
J'ai aimé Joël explication, qui traite d'une semblable binaire à virgule flottante de précision problème dans Excel 2007:
Voir comment il y a beaucoup de 0110 0110 0110-il à la fin? C'est parce que de 0,1 a pas de représentation exacte en binaire... c'est un nombre binaire répétitif. C'est un peu comme la façon dont 1/3 a pas de représentation en virgule. 1/3 est 0.33333333 et vous devez continuer à écrire de 3 pour toujours. Si vous perdez patience, vous obtenez quelque chose d'inexact.
Vous pouvez donc imaginer comment, en décimal, si vous avez essayé de faire 3*1/3, et vous n'avez pas de temps pour écrire 3 à jamais, le résultat que vous obtiendriez serait 0.99999999, pas 1, et les gens seraient en colère avec vous tromper.
C'est en partie spécifique à la plateforme, - et nous ne savons pas ce que la plateforme que vous utilisez.
C'est aussi en partie une affaire de savoir ce que vous voulez voir. Le débogueur est de vous montrer - dans une certaine mesure, de toute façon - précise de la valeur stockée dans la variable. Dans mon article sur les binaires des nombres à virgule flottante dans .NET, il y a une classe C# qui permet de voir absolument exacte, le numéro enregistré dans la un double. La version en ligne ne fonctionne pas pour le moment - je vais essayer d'en mettre une sur un autre site.
Étant donné que le débogueur voit le "réel" de la valeur, il faut prendre une décision au sujet de ce qui est à afficher - il pourrait vous montrer la valeur arrondie à quelques décimales, ou une valeur plus précise. Certains des débogueurs de faire un meilleur travail que les autres à la lecture de développeurs à l'esprit, mais c'est un problème fondamental avec le binaire des nombres à virgule flottante.
Utilisez le point fixe, decimal
type si vous voulez la stabilité à la limite de la précision. Il y a des frais généraux, et vous devez convertir explicitement si vous souhaitez convertir à virgule flottante. Si vous ne vous convertissez à virgule flottante vous permettra de réintroduire les instabilités qui semble vous déranger.
Alternativement, vous pouvez obtenir sur elle et apprendre à travailler avec la précision limitée de l'arithmétique à virgule flottante. Par exemple, vous pouvez utiliser l'arrondissement pour mettre les valeurs convergent, ou vous pouvez utiliser epsilon comparaisons pour décrire une tolérance. "Epsilon" est une constante que vous mis en place qui définit une tolérance. Par exemple, vous pouvez choisir à l'égard des deux valeurs étant égales si elles sont à l'intérieur de 0,0001 les uns des autres.
Il me semble que vous pourriez utiliser la surcharge d'opérateur pour faire epsilon comparaisons transparent. Ce serait très cool.
Pour la mantisse-exposant représentations EPSILON doit être calculée à rester à l'intérieur du représentable de précision. Pour un nombre N, Epsilon = N / 10E+14
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.