Question Différence entre décimal, float et double dans .NET?


Quelle est la différence entre decimal, float et double dans .NET?

Quand est-ce que quelqu'un en utiliserait un?


1772
2018-03-06 11:31


origine


Réponses:


float et double sont flottant binaire types de points. En d'autres termes, ils représentent un nombre comme celui-ci:

10001.10010110011

Le nombre binaire et l'emplacement du point binaire sont tous les deux codés dans la valeur.

decimal est un flottant décimal type de point. En d'autres termes, ils représentent un nombre comme celui-ci:

12345.65789

Encore une fois, le nombre et l'emplacement de décimal point sont tous deux codés dans la valeur - c'est ce qui fait decimal toujours un type à virgule flottante au lieu d'un type à virgule fixe.

La chose importante à noter est que les humains sont utilisés pour représenter des non-entiers sous une forme décimale, et attendent des résultats exacts dans les représentations décimales; tous les nombres décimaux ne sont pas exactement représentables en virgule flottante binaire - 0.1, par exemple - donc si vous utilisez une valeur à virgule flottante binaire, vous obtiendrez une approximation de 0.1. Vous obtiendrez toujours des approximations lors de l'utilisation d'un point décimal flottant - le résultat de la division 1 par 3 ne peut pas être représenté exactement, par exemple.

Quant à quoi utiliser quand:

  • Pour les valeurs qui sont des "décimales naturellement exactes", il est bon d'utiliser decimal. Ceci est généralement approprié pour tous les concepts inventés par les humains: les valeurs financières sont l'exemple le plus évident, mais il y en a d'autres aussi. Considérez le score donné aux plongeurs ou aux patineurs, par exemple.

  • Pour les valeurs qui sont plus des artefacts de la nature qui ne peuvent pas vraiment être mesurés exactement en tous cas, float/double sont plus appropriés. Par exemple, les données scientifiques seraient généralement représentées sous cette forme. Ici, les valeurs d'origine ne seront pas "précises au départ", donc il n'est pas important que les résultats attendus conservent la "précision décimale". Les types de points binaires flottants sont beaucoup plus rapides à utiliser que les nombres décimaux.


1963
2018-03-06 11:56



La précision est la principale différence.

Flotte - 7 chiffres (32 bits)

Double-15-16 chiffres (64 bits)

Décimal -28-29 chiffres significatifs (128 bits)

Les nombres décimaux ont une précision beaucoup plus élevée et sont généralement utilisés dans des applications financières nécessitant un haut degré de précision. Les nombres décimaux sont beaucoup plus lents (jusqu'à 20 fois dans certains tests) qu'un double / flotteur.

Les nombres décimaux et les nombres flottants / doubles ne peuvent pas être comparés sans le lancer alors que les nombres flottants et doubles le peuvent. Les nombres décimaux autorisent également les zéros de codage ou de fin.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

Résultat :

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

894
2018-03-06 11:33



La structure Decimal est strictement orientée vers les calculs financiers nécessitant une précision, qui sont relativement intolérants à l'arrondissement. Les nombres décimaux ne sont pas adéquats pour des applications scientifiques, cependant, pour plusieurs raisons:

  • Une certaine perte de précision est acceptable dans de nombreux calculs scientifiques en raison des limites pratiques du problème physique ou de l'artefact mesuré. La perte de précision n'est pas acceptable en finance.
  • Decimal est beaucoup (beaucoup) plus lent que float et double pour la plupart des opérations, principalement parce que les opérations en virgule flottante se font en binaire, alors que Decimal est fait en base 10 (les flotteurs et les doubles sont gérés par le matériel FPU, comme MMX / SSE , alors que les décimales sont calculées dans le logiciel).
  • Decimal a une plage de valeurs inacceptablement plus petite que double, malgré le fait qu'il supporte plus de chiffres de précision. Par conséquent, Decimal ne peut pas être utilisé pour représenter de nombreuses valeurs scientifiques.

65
2018-04-13 13:55



enter image description here

pour plus d'informations vous pouvez aller à la source de cette image:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5


54
2018-06-07 12:50



float 7 chiffres de précision

double a environ 15 chiffres de précision

decimal a environ 28 chiffres de précision

Si vous avez besoin d'une meilleure précision, utilisez le double au lieu du flotteur. Dans les processeurs modernes, les deux types de données ont presque les mêmes performances. Le seul avantage d'utiliser float est qu'ils occupent moins d'espace. Pratiquement importe seulement si vous en avez beaucoup.

J'ai trouvé cela intéressant. Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante


39
2017-08-29 00:06



Personne n'a mentionné cela

Dans les paramètres par défaut, Floats (System.Single) et doubles (System.Double) n'utiliseront jamais   le contrôle de débordement alors que Decimal (System.Decimal) utilisera toujours   vérification de débordement.

je veux dire

decimal myNumber = decimal.MaxValue;
myNumber += 1;

jette OverflowException.

Mais ceux-ci ne le font pas:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

28
2018-01-02 13:12



  1. Double et float peuvent être divisés par zéro entier sans exception à la fois lors de la compilation et de l'exécution.
  2. La décimale ne peut pas être divisée par zéro entier. La compilation échouera toujours si vous faites cela.

24
2017-07-29 07:21



Je ne vais pas répéter des tonnes de bonnes (et quelques mauvaises) informations déjà répondu dans d'autres réponses et commentaires, mais je vais répondre à votre question de suivi avec un conseil:

Quand est-ce que quelqu'un en utiliserait un?

Utiliser la décimale pour dénombré valeurs

Utilisez float / double pour mesuré valeurs

Quelques exemples:

  • l'argent (est-ce qu'on compte l'argent ou mesure l'argent?)

  • distance (compte-t-on la distance ou la distance de mesure? *)

  • scores (compte-t-on les scores ou les scores?)

Nous comptons toujours l'argent et ne devrions jamais le mesurer. Nous mesurons habituellement la distance. Nous comptons souvent les scores.

* Dans certains cas, ce que j'appellerais distance nominale, nous pouvons en effet vouloir «compter» la distance. Par exemple, nous traitons peut-être des signes de pays qui indiquent les distances par rapport aux villes, et nous savons que ces distances n'ont jamais plus d'un chiffre décimal (xxx.x km).


24
2018-04-22 15:18



Les types de variable Decimal, Double et Float sont différents dans la façon dont ils stockent les valeurs. La précision est la principale différence lorsque float est un type de données à virgule flottante simple précision (32 bits), double est un type de données à virgule flottante double précision (64 bits) et décimal est un type de données à virgule flottante de 128 bits.

Flotteur - 32 bits (7 chiffres)

Double - 64 bits (15-16 chiffres)

Décimal - 128 bits (28 à 29 chiffres significatifs)

La principale différence est que Floats et Doubles sont des types à virgule flottante binaire et un Decimal stocke la valeur sous forme de virgule décimale flottante. Les décimales ont donc une précision beaucoup plus grande et sont généralement utilisées dans des applications de calcul monétaires (financières) ou scientifiques nécessitant un haut degré de précision. Mais en termes de performances, les nombres décimaux sont plus lents que les types double et flottant.

Décimal peut 100% représenter avec précision n'importe quel nombre dans la précision du format décimal, tandis que Float et Double, ne peut pas représenter avec précision tous les nombres, même les nombres qui sont dans leurs formats respectifs de précision.

Décimal

Dans le cas d'applications financières, ou de calculs scientifiques, il est préférable d'utiliser les types décimaux car cela vous donne un haut niveau de précision et évite facilement les erreurs d'arrondi

Double

Les types doubles sont probablement le type de données le plus couramment utilisé pour les valeurs réelles, à l'exception du traitement de l'argent.

Flotte

Il est principalement utilisé dans les bibliothèques graphiques car les demandes de puissances de traitement sont très élevées et les situations d'utilisation peuvent supporter des erreurs d'arrondi.


23
2018-06-19 04:34



Les nombres entiers, comme cela a été mentionné, sont des nombres entiers. Ils ne peuvent pas stocker le point quelque chose, comme .7, .42 et .007. Si vous devez stocker des nombres qui ne sont pas des nombres entiers, vous avez besoin d'un type de variable différent. Vous pouvez utiliser le type double ou le type float. Vous définissez ces types de variables exactement de la même manière: au lieu d'utiliser le mot int, vous tapez double ou float. Comme ça:

float myFloat;
double myDouble;

(float est court pour "virgule flottante", et signifie simplement un nombre avec un point quelque chose à la fin.)

La différence entre les deux est dans la taille des nombres qu'ils peuvent contenir. Pour float, vous pouvez avoir jusqu'à 7 chiffres dans votre numéro. Pour doubles, vous pouvez avoir jusqu'à 16 chiffres. Pour être plus précis, voici la taille officielle:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

float est un nombre de 32 bits, et double est un nombre de 64 bits.

Double-cliquez sur votre nouveau bouton pour obtenir le code. Ajoutez les trois lignes suivantes à votre code de bouton:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

Arrêtez votre programme et revenez à la fenêtre de codage. Changez cette ligne:

myDouble = 0.007;
myDouble = 12345678.1234567;

Exécutez votre programme et cliquez sur votre double bouton. La boîte de message affiche correctement le numéro. Ajouter un autre nombre à la fin, cependant, et C # sera à nouveau arrondi vers le haut ou vers le bas. La morale est que si vous voulez de l'exactitude, faites attention aux arrondis!


22
2018-05-22 12:05



Cela a été un fil intéressant pour moi, car aujourd'hui, nous avons juste eu un méchant petit bug, concernant decimal ayant moins de précision qu'un float.

Dans notre code C #, nous lisons des valeurs numériques à partir d'une feuille de calcul Excel, en les convertissant en decimal, puis envoyer ce decimal retour à un service pour enregistrer dans un serveur SQL base de données.

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

Maintenant pour presque toutes de nos valeurs Excel, cela a fonctionné à merveille. Mais pour certains, de très petites valeurs Excel, en utilisant decimal.TryParse perdu la valeur complètement. Un tel exemple est

  • cellValue = 0,00006317592

  • Decimal.TryParse (cellValue.ToString (), valeur de sortie); // retournerais 0

La solution, bizarrement, était de convertir les valeurs Excel en double d'abord, puis dans un decimal:

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    …
}

Même si double a moins de précision qu'un decimal, cela garantissait en fait que de petits nombres seraient encore reconnus. Pour certaines raisons, double.TryParse était en mesure de récupérer de si petits nombres, alors que decimal.TryParse les mettrait à zéro.

Impair. Très étrange.


12
2018-04-16 09:23