Problème dans double.Parse managé C ++
-
11-09-2019 - |
Question
Je reçois un problème bizarre lors de l'analyse d'une valeur double managé C ++. Peut-être que je fais quelque chose de mal. Quand je fais:
double value = 0.006;
result = Math::Parse( value)
La sortie de résultat est 0.006000000000001
. Pourquoi est-il un 1 AJOUT DE?
Aussi quand je vais un tour de la valeur à 5 décimales, il échoue. Je fais:
result2 = Math::Round(result, 5)
Mais result2
est toujours 0.006000000000001
. Qu'est-ce que je fais mal?
La solution
Il est normal. Ce problème causé par le format IEEE double - en temps réel 0,006 est représentée comme approximation de la fraction binaire infinie. Vous avez donc 3 façons -
- formating utilisation de chaîne correspondant à la sortie
- utilisez le type décimal
- ne pas utiliser == pour comparer les numéros, utilisez plutôt
avec l'erreur constante, par exemple: (X -0,06)
Autres conseils
Ceci est dû à la précision. J'ai donné cette réponse :
et doubles sont Flotteurs nombre représentations avec un certain précision. Pas toutes les valeurs peut être représenté dans ce format. Voir aussi bien.
Vous pouvez facilement penser pourquoi cela être le cas: il y a un nombre illimité nombre de numéro seulement dans le intervall (1..1), mais un flotteur a seulement un nombre limité nombre de bits pour représenter toutes nombres dans (-MAXFLOAT..MAXFLOAT).
Plus bien dit: dans un entier de 32 bits représentation il y a une dénombrable nombre d'entiers à représenter, Mais il y a une infinité d'innombrables nombre de valeurs réelles qui ne peuvent pas être entièrement représentée dans un nombre limité de représentation de 32 ou 64 bits. Par conséquent, il est non seulement une limite à le plus haut et le plus bas représentable valeur réelle, mais aussi à l'exactitude.
Alors, pourquoi est un nombre qui a peu chiffres après la virgule flottante affecté? Parce que la représentation est basé sur un système binaire à la place de une décimale, ce qui rend les autres numéros facilement représentée ensuite les décimales.
numéros doubles de précision sont essentiellement des approximations, et ont souvent des queues que vous ne peut pas se débarrasser de -. Dire qu'il n'y a pas moyen d'exprimer le nombre avec plus de précision
Vous pouvez obtenir des résultats plus comme vous attendent si vous utilisez decimal
- ce qui est encore une approximation, mais il utilise la base-10, donc a tendance à se comporter comme on s'y attend. Mais parce qu'il ne correspond pas à un type de processeur, il est plus lent.