.net - entre - float double




Différence entre décimal, float et double dans.NET? (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.

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

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


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

Dans notre code C #, nous lisons les valeurs numériques d'une feuille de calcul Excel, les convertissons en nombre decimal , puis renvoyons cette decimal à un service pour enregistrer dans une base de données SQL Server .

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 nos valeurs Excel, cela a fonctionné magnifiquement. Mais pour certains, très petites valeurs Excel, en utilisant decimal.TryParse perdu la valeur. Un tel exemple est

  • cellValue = 0.00006317592

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

La solution, bizarrement, était de convertir les valeurs Excel en un double premier, puis en un nombre 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 le double a moins de précision qu'une decimal , cela garantit que de petits nombres seront toujours reconnus. Pour une raison quelconque, double.TryParse était réellement capable de récupérer de tels petits nombres, alors que decimal.TryParse mettrait à zéro.

Impair. Très étrange.


Flotter ~ ± 1,5 x 10-45 à ± 3,4 x 1038 -------- 7 chiffres
double ~ ± 5,0 x 10-324 à ± 1,7 x 10308 ------ 15 ou 16 chiffres
décimal ~ ± 1,0 x 10-28 à ± 7,9 x 1028 -------- 28 ou 29 chiffres


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 les valeurs comptées

Utiliser float / double pour les valeurs mesurées

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


La principale différence entre chacun d'eux est la précision.

float est un nombre de 32-bit , double est un nombre de 64-bit et decimal est un nombre de 128-bit .


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.

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 l'abréviation de "floating point", 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 les double , 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!


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 chiffres 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.


Personne n'a mentionné cela

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

je veux dire

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

throws OverflowException .

Mais ceux-ci ne le font pas:

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

&

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

Pour les applications telles que les jeux et les systèmes embarqués où la mémoire et les performances sont toutes les deux critiques, float est généralement le type de choix numérique car il est plus rapide et la moitié de la taille d'un double. Les entiers étaient l'arme de choix, mais les performances à virgule flottante ont dépassé les entiers dans les processeurs modernes. La décimale est juste sortie!


float et double sont des types de points binaires flottants . 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 type décimal flottant . En d'autres termes, ils représentent un nombre comme celui-ci:

12345.65789

Encore une fois, le nombre et l'emplacement de la virgule décimale sont tous deux codés dans la valeur - c'est ce qui fait que 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 la 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 de toute façon, 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.






decimal