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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top