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)
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".
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 .
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.
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)
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.
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
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