Quand dois-je utiliser double au lieu de la virgule?
Je peux nommer trois avantages de l'utilisation de double
(ou float
) au lieu de decimal
:
- Utilise moins de mémoire.
- Plus rapide car virgule flottante opérations mathématiques sont pris en charge nativement par les transformateurs.
- Peut représenter une plus grande gamme de nombres.
Mais ces avantages semblent s'appliquent uniquement au calcul intensif opérations, tels que ceux trouvés dans les logiciels de modélisation. Bien sûr, les doubles ne doit pas être utilisé lorsque la précision est requise, comme les calculs financiers. Alors y at-il des raisons pratiques à jamais choisir double
(ou float
) au lieu de decimal
dans des applications "normales"?
Édité pour ajouter:
Merci pour toutes ces excellentes réponses, j'ai appris d'eux.
Une autre question: quelques personnes ont fait le point de doubles peut plus représenter des nombres réels. Lors de sa déclaration, je pense que, en général, avec plus de précision les représenter ainsi. Mais est-il un énoncé vrai que la précision peut diminuer (parfois considérablement) lors d'opérations en virgule flottante sont effectuées?
- voir aussi stackoverflow.com/questions/2545567/...
- Cela devient upvoted assez régulièrement et j'ai toujours du mal avec elle. Par exemple, je travaille sur une application qui ne les calculs financiers donc je suis en utilisant décimal dans l'ensemble. Mais les Maths et VisualBasic.Fonctions financières double donc il y a beaucoup de convertir ce qui m'a constamment deuxième deviner l'utilisation de la virgule.
- c'est fou les fonctions Financières utiliser des doubles, l'argent doit toujours être en décimal.
- Mais que peut-jamie Ide de travailler avec de l'héritage de la merde en utilisant le double? Ensuite, vous devez utiliser le double de trop sinon le nombre de conversions provoquer des erreurs d'arrondi... pas de merveilles, il a mentionné VisualBasic pfffhh.....
- je serais probablement utiliser une autre bibliothèque que correctement pris en charge décimal. Quelle Que Soit VisualBasic.Financière fournit existe probablement dans plusieurs autres bibliothèques d'aujourd'hui
- Double Possible de Différence entre décimal, float et double dans .NET?
Vous devez vous connecter pour publier un commentaire.
Je pense que tu viens de résumer les avantages tout à fait bien. Vous êtes cependant il manque un point. Le
décimal
type est seulement plus précis au représentant de la base de 10 nombres (par exemple ceux de monnaie/calculs financiers). En général, ladouble
type va offrir au moins aussi grande précision (quelqu'un me corrige si je me trompe) et certainement une plus grande vitesse pour arbitraire des nombres réels. La conclusion est simple: lorsque l'on envisage de l'utiliser, utilisez toujoursdouble
, sauf si vous avez besoin de labase 10
précision quedecimal
offre.Edit:
Concernant votre question supplémentaire à propos de la diminution de la précision des nombres à virgule flottante après les opérations, c'est un peu plus subtile question. En effet, la précision (j'utilise ce terme de façon interchangeable pour plus de précision ici) va diminuer régulièrement après chaque opération est effectuée. Cela est dû à deux raisons:
Dans tous les cas, si vous voulez comparer deux nombres à virgule flottante qui devrait en théorie être équivalent (mais on est parvenu à l'aide de différents calculs de), vous devez autoriser un certain degré de tolérance (combien varie, mais est généralement très petits).
Pour une présentation plus détaillée des cas particuliers où des erreurs de précision peut être introduit, voir la Précision de la section de la Article de Wikipedia. Enfin, si vous voulez sérieusement en profondeur (et mathématique) discussion des nombres à virgule flottante/opérations au niveau des machines, essayez de lire l'article souvent cité Ce que Tout informaticien Devez Savoir à Propos de l'Arithmétique à virgule Flottante.
double
. Les ordinateurs modernes s'imprime toujours la bonne valeur, mais seulement parce qu'ils “deviner” à la suite – pas parce que c'est vraiment exprimé correctement.Decimal
type a 93-bits de précision dans la mantisse, comparativement à environ 52 pourdouble
. Je souhaite que Microsoft pris en charge la norme IEEE 80 bits format, bien que, même si elle devait être complétée à 16 octets; elle aurait permis une plus grande gamme dedouble
ouDecimal
, beaucoup mieux la vitesse deDecimal
, le soutien pour transcendantale opérations (par exemple, sin(x), log(x), etc.), et de précision qui, bien que pas tout à fait aussi bon queDecimal
seraient bien mieux quedouble
.Vous semble sur place avec les avantages de l'utilisation d'un type à virgule flottante. J'ai tendance à concevoir pour les décimales dans tous les cas, et s'appuient sur un profileur de me laisser savoir si les opérations sur les décimaux est à l'origine des goulots d'étranglement ou les ralentissements. Dans ces cas, je vais "en bas" jeté de lit double ou float, mais seulement le faire en interne, et soigneusement essayer de gérer la perte de précision due en limitant le nombre de chiffres significatifs dans l'opération mathématique à effectuer.
En général, si votre valeur est transitoire (pas réutilisé), vous êtes sûr d'utiliser un type à virgule flottante. Le vrai problème avec virgule flottante types est la suivante pour les trois scénarios.
123456789.1 * .000000000000000987654321
)MODIFIER
Selon la la documentation de référence sur le C# décimales:
Afin de clarifier ma déclaration ci-dessus:
Je n'ai jamais travaillé dans les industries où les décimales sont favorables. Si vous travaillez sur phsyics ou les moteurs graphiques, il est probablement beaucoup plus bénéfique pour la conception d'un type à virgule flottante (float ou double).
Décimal n'est pas infiniment précis (il est impossible de représenter une précision infinie pour les non-intégré dans un type de données primitif), mais il est beaucoup plus précis que le double:
EDIT 2
En réponse à Konrad Rudolph's commentaire, le point n ° 1 (ci-dessus) est certainement correct. L'agrégation de l'imprécision n'est en effet composé. Voir le code ci-dessous pour un exemple:
Ce sorties suivantes:
Comme vous pouvez le voir, même si nous ajoutons à partir de la même source constante, les résultats de la double est moins précis (bien que probablement va s'arrondir correctement), et le flotteur est beaucoup moins précis, au point où il a été réduit à seulement deux chiffres significatifs.
Single: 667660.400000000000
tandis que la valeur décimale donnéDecimal: 666666.7000000000
. La valeur float est un peu moins d'un millier sur la valeur correcte.Décimal base 10 valeurs, par exemple les calculs financiers, comme d'autres l'ont suggéré.
Mais le double est généralement plus précis, pour arbitraire des valeurs calculées.
Par exemple, si vous souhaitez calculer le poids de chaque ligne dans un portefeuille, utilisez le double que le résultat sera plus près de 100%.
Dans l'exemple suivant, doubleResult est plus proche de 1 que decimalResult:
À nouveau en prenant l'exemple d'un portefeuille:
La valeur de marché de chaque ligne dans le portefeuille d'une valeur monétaire et le mieux serait peut-être représenté comme séparateur décimal.
Le poids de chaque ligne du portefeuille (= Valeur de Marché /SOMME(Valeur de Marché)) est généralement représenté comme un double.
L'utilisation d'un lit double ou d'un flotteur lorsque vous n'avez pas besoin d'une grande précision, par exemple, dans un jeu de plateforme que j'ai écrit, j'ai utilisé un flotteur pour stocker le joueur vitesses. Évidemment, je n'ai pas besoin de super précision ici parce que j'ai finalement ronde pour un Int pour le dessin sur l'écran.
Dans certains de Comptabilité, d'envisager la possibilité d'utiliser les types intégraux à la place ou en conjonction. Par exemple, disons que les règles fonctionnent sous chaque résultat de calcul de report de avec au moins 6 chiffres après la virgule et le résultat final sera arrondi au centime le plus proche.
Un calcul de 1/6ème de 100 $rendements $16.66666666666666..., de sorte que la valeur portée en avant dans une feuille de calcul sera de $16.666667. À la fois double et décimal doit produire ce résultat avec précision à 6 décimales. Cependant, nous pouvons éviter tout cumul d'erreur par la réalisation de la suite de l'avant comme un entier 16666667. Chaque calcul peut être fait avec la même précision et mis en avant de la même façon. En reprenant l'exemple, j'ai calculer le Texas de la taxe de vente sur ce montant (16666667 * .0825 = 1375000). En ajoutant les deux (c'est une courte distance de la feuille de calcul) 1666667 + 1375000 = 18041667. En déplaçant la virgule de retour dans nous donne 18.041667, ou $18.04.
Pendant ce court exemple ne serait pas le rendement cumulatif de l'erreur en utilisant le double ou décimal, il est assez facile de montrer des cas où tout simplement le calcul de la double ou de la virgule et le report permettrait d'accumuler des erreurs significatives. Si les règles vous fonctionner sous nécessitent un nombre limité de chiffres après la virgule, le stockage de chaque valeur comme un nombre entier en multipliant par 10^(obligatoire nombre de décimale après la virgule), puis en divisant par 10^(obligatoire nbre de décimales) pour obtenir la valeur réelle volonté d'éviter tout cumul d'erreur.
Dans les situations où les fractions de centimes ne pas se produire (par exemple, un distributeur automatique), il n'y a aucune raison de recourir à d'autres types intégraux à tous. Il suffit de penser comme le comptage des sous, pas des dollars. J'ai vu du code, où chaque calcul impliqué que l'ensemble des sous, encore utilisation de la double conduit à des erreurs! Entier des mathématiques retiré de la question. Donc ma réponse est non conventionnelles, si possible, de renoncer à la fois double et décimal.
Si vous avez besoin de binaire interrop avec d'autres langues ou des plates-formes, alors vous pourriez avoir besoin d'utiliser float ou double, qui sont normalisés.
Note: ce poste est basé sur des informations de type décimal capacités de http://csharpindepth.com/Articles/General/Decimal.aspx et ma propre interprétation de ce que cela signifie. Je vais supposer Double est normal que la double précision IEEE.
Note2: le plus petit et le plus grand dans ce post, appellent à l'ampleur du nombre.
Pros de la "virgule".
Les inconvénients de décimal
Mon avis est que vous devez par défaut à l'aide de "virgule" pour le travail de l'argent et d'autres cas où l'appariement de calcul de l'homme exactement qui est important et que vous devez utiliser le double de votre choix par défaut le reste du temps.
Utilisation floating points, si vous la valeur de rendement de plus de justesse.
Choisir le type en fonction de votre application. Si vous avez besoin de précision, comme dans l'analyse financière, vous avez répondu à votre question. Mais si votre application peut s'installer avec une estimation de votre ok avec double.
Votre demande est dans le besoin de la vitesse de calcul ou s'il va avoir tout le temps dans le monde pour vous donner une réponse? Cela dépend vraiment du type d'application.
Graphique de la faim? float ou double, c'est assez. L'analyse de données, météore frappant une planète de précision ? Ceux qui auraient besoin d'un peu de précision 🙂
Décimal a large octets, double est supporté nativement par la CPU. Virgule est en base 10, donc un nombre décimal à double conversion qui se passe tout en un nombre décimal est calculée.
Garder à l'esprit .NET CLR prend uniquement en charge les Mathématiques.Pow(double,double). Virgule n'est pas pris en charge.
.NET Framework 4
Un double des valeurs va sérialiser à la notation scientifique par défaut si cette notation est plus courte que l'affichage des décimales. (par exemple, .00000003 seront 3e-8) les valeurs après la Virgule ne sera jamais sérialiser à la notation scientifique. Lors de la sérialisation pour la consommation par un tiers extérieur, cela peut être une considération.
Dépend de ce que vous en avez besoin pour.
Car float et double sont les types de données binaires vous avez certains diifculties et errrors à la manière des tours de nombres, de sorte que par exemple double autour de 0,1 à 0.100000001490116, double serait également autour de 1 /3 de 0.33333334326441. Simplement ne mettez pas tous les nombres réels sont exacts, la représentation en double types
Heureusement C# prend également en charge la soi-disant décimal de l'arithmétique à virgule flottante, où les nombres sont représentés par le système numérique décimal plutôt que le système binaire. Ainsi, la virgule flottante-arithmétique ne pas perdre de la précision lors du stockage et du traitement des nombres à virgule flottante. Cela le rend particulièrement adapté pour les calculs d'un haut niveau de précision est nécessaire.