Question décimal vs double! - Lequel dois-je utiliser et quand? [dupliquer]


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

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


756
2017-07-22 14:37


origine


Réponses:


Pour de l'argent, toujours décimal. C'est pourquoi il a été créé.

Si les nombres doivent correspondre correctement ou être équilibrés, utilisez le nombre décimal. Cela inclut tout stockage financier ou calculs, scores ou autres numéros que les gens pourraient faire à la main.

Si la valeur exacte des nombres n'est pas importante, utilisez le double pour la vitesse. Ceci inclut les calculs graphiques, physiques ou d'autres sciences physiques où il y a déjà un "nombre de chiffres significatifs".


901
2017-07-22 14:42



Ma question est quand devrait utiliser un   double et quand devrais-je utiliser une décimale   type?

decimal pour quand vous travaillez avec des valeurs dans la gamme de 10 ^ (+/- 28) et où vous avez des attentes sur le comportement basé sur les représentations de base 10 - essentiellement de l'argent.

double pour quand vous avez besoin relatif la précision (c'est-à-dire la perte de précision dans les chiffres de fin sur de grandes valeurs n'est pas un problème) à travers des grandeurs très différentes - double couvre plus de 10 ^ (+/- 300). Les calculs scientifiques sont le meilleur exemple ici.

quel type convient à l'argent   calculs?

décimal, décimal, décimal

Accepter aucun substitut.

Le facteur le plus important est que double, étant mis en œuvre comme une fraction binaire, ne peut pas représenter avec précision beaucoup decimal fractions (comme 0,1) du tout et son nombre global de chiffres est plus petit car il est de 64 bits par rapport à 128 bits pour decimal. Enfin, les applications financières doivent souvent suivre des modes d'arrondi (parfois mandaté par la loi). decimal  soutient ces; double ne fait pas.


157
2017-07-22 15:12



System.Single / flotte - 7 chiffres
System.Double / double - 15-16 chiffres
System.Decimal / 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) est en grande quantité:

  • £ 520.532.52 - 8 chiffres
  • 1 323 523,12 £ - 9 chiffres

Vous vous retrouvez à 1 million pour un flotteur.

Une valeur monétaire de 15 chiffres:

  • 1 234 567 890 123,45 £

9 billions avec un double. Mais avec la division et les comparaisons c'est plus compliqué (je ne suis certainement pas un expert en nombres flottants et irrationnels - voir le point de Marc). Mélanger des nombres décimaux et des doubles cause 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 pourrait ne pas   exactement approcher la décimale   nombre.

Quand dois-je utiliser double au lieu de décimal?a des réponses similaires et plus en profondeur.

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 l'envisager.


34
2018-02-04 12:06



Decimal est pour les valeurs exactes. Le double est pour les valeurs approximatives.

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

32
2017-07-22 14:59



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


23
2017-07-22 14:39



Absolument 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 à virgule flottante est adéquat.

Voici un exemple en 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 à nouveau avec 10 ^ 20 dollars du Zimbabwe

>>> 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 integer, cela fonctionne bien:

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

6
2017-07-22 14:56



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

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html


4
2017-11-26 13:23