Question

  

Possible en double:    Pourquoi arithmétique en virgule flottante en C # imprécise

J'ai eu affaire à quelques chiffres et C #, et la ligne suivante des résultats de code dans un autre numéro que l'on pourrait attendre:

double num = (3600.2 - 3600.0);

Je pensais num à 0,2, cependant, il est avéré être ,1999999999998181. Y at-il des raisons pour lesquelles il produit un proche, mais toujours différent décimales?

Était-ce utile?

La solution

En effet, double est un point flottant type de données.

Si vous voulez plus de précision, vous pouvez passer à l'aide de la place decimal.

Le suffixe littéral pour decimal est m, donc à utiliser l'arithmétique decimal (et produire un résultat de decimal) vous pouvez écrire votre code comme

var num = (3600.2m - 3600.0m);

Notez qu'il ya des inconvénients à l'aide d'un decimal. Il est un type de données de 128 bits au lieu de 64 bits qui est la taille d'un double. Cela rend plus coûteux en termes de mémoire et de traitement. Il dispose également d'une gamme beaucoup plus petite que double.

Autres conseils

Il y a une raison.

La raison en est que la façon dont le numéro est enregistré dans la mémoire, en cas de double type de données, ne permet pas une représentation exacte du nombre 3600,2. Elle ne permet pas une représentation exacte du nombre 0,2.

0,2 a une représentation infinie en binaire. Si vous voulez stocker dans des registres de mémoire ou d'un processeur, d'effectuer certains calculs, un nombre proche de 0,2 avec une représentation finie est stockée à la place. Il ne peut pas être évident si vous exécutez du code comme celui-ci.

double num = (0.2 - 0.0);

En effet, dans ce cas, tous les chiffres binaires disponibles pour représenter les nombres en deux types de données sont utilisées pour représenter la partie décimale du nombre (il n'y a que la partie décimale) et la précision est plus élevée. Si vous enregistrez le numéro 3600,2 dans un objet de type double, certains chiffres sont utilisés pour représenter la partie entière - 3600 et il y a moins de chiffres représentant une partie fractionnelle. La précision est partie inférieure et fractionnée qui est en fait mémorisé dans la mémoire diffère de 0,2 suffisant, il devient évident que, après conversion de la double chaîne à

Modifier le type à decimal:

decimal num = (3600.2m - 3600.0m);

Vous devriez également lire cette .

Wikipedia

ne peut expliquer mieux. Je peux aussi vous suggérons de lire Ce que tout informaticien doit savoir sur-Arithmétique virgule flottante . Ou voir les questions connexes sur StackOverflow .

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