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

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

je vois toujours des gens qui utilisent des doubles en Do. Je sais que j'ai lu quelque part que les doubles perdent parfois la précision. Ma question Est de savoir quand utiliser un double et quand je dois utiliser un type décimal? Quel type est approprié pour les calculs d'argent? (IE. plus de 100 millions de dollars)

776
demandé sur HerbalMart 2009-07-22 18:37:54

7 réponses

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

si les nombres doivent s'additionner correctement ou s'équilibrer, utilisez la décimale. Cela inclut tout stockage financier ou des calculs, des scores, ou d'autres nombres que les gens pourraient faire à la main.

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

927
répondu David 2009-07-22 14:42:15

ma question Est de savoir quand un double et quand dois-je utiliser une virgule le type?

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

double pour quand vous avez besoin de" 1519150920 précision "relative (c.-à-d. perte de précision dans les chiffres de queue sur les grands les valeurs ne sont pas un problème) à travers des grandeurs très différentes - double couvre plus de 10^(+/-300). Les calculs scientifiques en sont le meilleur exemple.

quel type convient à l'argent les calculs?

décimal, décimal , décimal

N'accepte aucun remplaçant.

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 de decimal fractions (comme 0,1) du tout et son nombre total de chiffres est plus petit car il est 64 bits de large par rapport à 128 bits pour decimal . Enfin, les applications financières doivent souvent suivre les modes d'arrondissement (parfois prescrits par la loi). decimal supporte ces ; double ne supporte pas ces .

159
répondu Michael Borgwardt 2012-01-11 10:18:58

du Système.Simple / float - 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 ya quelques années) est avec de grandes quantités:

  • £520 532.52-8 chiffres
  • £1,323,523.12-9 chiffres

vous êtes à court d'un million pour un char.

une valeur monétaire à 15 chiffres:

  • £1,234,567,890,123.45

9 trillions 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élange décimales et doubles causes problèmes:

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

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

utiliser double au lieu de decimal pour des applications monétaires est une micro-optimisation - c'est la façon la plus simple que je vois.

35
répondu Chris S 2017-05-23 12:10:33

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

USD: ,345.67 USD (Decimal)
CAD: ,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)
32
répondu Ian Boyd 2009-07-22 14:59:57

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

24
répondu Clement Herreman 2012-01-11 10:18:56

certainement utilisez les types entiers pour vos calculs d'argent. On ne saurait trop insister sur ce point, car à première vue, il peut sembler qu'un système à 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.

essayez à nouveau avec 10^20 Zimbabwe dollars

>>> 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
6
répondu Otto Allmendinger 2012-04-05 10:12:22

je pense que la principale différence à côté de la largeur de bits est que décimal A La base d'exposant 10 et double a 2

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

5
répondu Honzajscz 2012-04-05 10:11:36