Question

Cette question a déjà une réponse ici :

Je continue de voir des gens utiliser des doubles en C#.Je sais que j'ai lu quelque part que les doubles perdent parfois en précision.Ma question est la suivante : quand dois-je utiliser un double et quand dois-je utiliser un type décimal ?Quel type convient aux calculs monétaires ?(c'est à dire.supérieur à 100 millions de dollars)

Était-ce utile?

La solution

Pour de l'argent, toujours décimal. C'est la raison pour laquelle il a été créé.

Si les chiffres doivent ajouter correctement ou de l'équilibre, utilisez décimal. Cela inclut tout stockage financier ou les calculs, les scores, ou d'autres chiffres que les gens pourraient faire à la main.

Si la valeur exacte des nombres est pas important, utiliser le double pour la vitesse. Cela comprend des graphiques, de la physique ou d'autres calculs des sciences physiques où il existe déjà un « nombre de chiffres significatifs ».

Autres conseils

  

Ma question est quand si un usage d'une   double et quand dois-je utiliser un nombre décimal   saisissez?

decimal lorsque vous travaillez avec des valeurs de l'ordre de 10 ^ (28 +/-) et où vous avez des attentes sur le comportement basé sur la base de 10 représentations -. Essentiellement de l'argent

double lorsque vous avez besoin relative précision (par exemple perte de précision dans les chiffres de suivi sur les grandes valeurs ne sont pas un problème) à travers des grandeurs très différentes - double couvre plus de 10 ^ (+/- 300) . calculs scientifiques sont le meilleur exemple.

  

quel type convient pour l'argent   calculs?

décimal

décimal , décimal

Accepter aucun produit de remplacement.

Le facteur le plus important est que double, mis en œuvre en tant que fraction binaire, ne peut pas représenter avec précision de nombreuses fractions de decimal (comme 0,1) tout et son nombre total de chiffres est plus petit car il est 64- peu large par rapport à 128 bits pour decimal. Enfin, les applications financières doivent souvent suivre spécifiques arrondi modes (parfois mandaté par la loi). decimal supporte ces ; double ne fonctionne pas.

Système.Single / flotter - 7 chiffres
Système.Double / double - 15-16 chiffres
Système.Décimal / décimal - 28-29 chiffres significatifs

La façon dont j'ai été piqué en utilisant le mauvais type (il y a quelques années) concerne les grandes quantités :

  • 520 532,52 £ - 8 chiffres
  • 1 323 523,12 £ - 9 chiffres

Vous manquez d'un million pour un flottant.

Une valeur monétaire à 15 chiffres :

  • £1,234,567,890,123.45

9 000 milliards avec un double.Mais avec la division et les comparaisons, c'est plus compliqué (je ne suis certainement pas un expert en virgule flottante et en nombres irrationnels - voir le point de Marc).Le mélange de décimales et de doubles provoque des problèmes :

Une opération mathématique ou de comparaison qui utilise un nombre à virgule flottante pourrait ne pas donner le même résultat si un nombre décimal est utilisé parce que le nombre à virgule flottante peut ne pas approximation exacte de la décimale nombre.

Quand dois-je utiliser le double au lieu du décimal ? a des réponses similaires et plus approfondies.

En utilisant double au lieu de decimal pour les applications monétaires est une micro-optimisation - c'est la façon la plus simple de voir les choses.

décimal est pour les valeurs exactes. Double est pour les valeurs approximatives.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

Pour de l'argent: decimal. Il coûte un peu plus de mémoire, mais n'a pas des problèmes d'arrondi comme double a parfois.

Certainement utiliser des types entiers pour vos calculs d'argent. Cela ne peut pas être assez souligné, car à première vue, il peut sembler qu'un type de virgule flottante est adéquat.

Voici un exemple dans le code python:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

semble assez normal.

Maintenant, essayez ceci à nouveau avec 10 ^ 20 dollars zimbabwéens

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

Comme vous pouvez le voir, le dollar a disparu.

Si vous utilisez le type entier, il fonctionne très bien:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

Je pense que la principale différence à côté de largeur de bit est que la base décimale a exposant 10 et double a 2

http: // logiciel par produit development.blogspot.com/2008/07/net-double-vs-decimal.html

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