458 votes

Quel est le meilleur type de données à utiliser pour l'argent en C# ?

Quel est le meilleur type de données à utiliser pour l'argent en C# ?

5 votes

Vous pourriez trouver des réponses dans ce qui suit poste utile.

1 votes

Voici un mappage pour tous les types de données : docs.microsoft.com/fr/us/dotnet/framework/data/adonet/

0 votes

De même, si vous utilisez des annotations de données, incluez using System.ComponentModel.DataAnnotations; ... [DataType(DataType.Currency)] msdn.microsoft.com/fr/us/library/

453voto

Lee Treveil Points 2115

Comme il est décrit à décimal comme :

Le mot-clé décimal indique un type de données de 128 bits. Par rapport aux types à virgule flottante, le type décimal a une plus grande précision et un plage plus petite, ce qui en fait un approprié pour les questions financières et monétaires les calculs.

Vous pouvez utiliser une décimale comme suit :

decimal myMoney = 300.5m;

46 votes

Vous devez expliquer en quoi ce lien est important. Une réponse doit être suffisamment bonne en soi, avec un lien comme référence ou détail supplémentaire. Voir stackoverflow.com/help/how-to-answer

2 votes

La réponse de longueur minimale peut donc comporter moins de caractères que le commentaire de longueur minimale - intéressant ! Ce n'est pas que j'aie un problème avec la réponse laconique/concise, surtout lorsqu'elle est également "profonde" en ce sens qu'elle renvoie à une discussion plus approfondie.

5 votes

Réponse étonnante, et je ne pense pas qu'elle ait besoin de plus d'explications puisqu'elle répond complètement à la question. Le lien vers la documentation MSDN est un bonus à mes yeux. Bravo !

116voto

David Walschots Points 2556

System.Decimal

Le type de valeur Decimal représente des nombres décimaux allant du positif 79 228 162 514 264 337 593 543 950 335 au négatif 79 228 162 514 264 337 593 543 950 335. Le type de valeur Décimal est approprié pour les calculs financiers nécessitant un grand nombre de chiffres entiers et fractionnaires significatifs et aucune erreur d'arrondi. Le type Décimal n'élimine pas la nécessité d'arrondir les chiffres. Il minimise plutôt les erreurs dues à l'arrondi.

J'aimerais souligner cette excellente réponse par zneak sur les raisons pour lesquelles le double ne devrait pas être utilisé.

74voto

lmsasu Points 2462

Utilisez le Le motif de l'argent de Modèles d'architecture d'application d'entreprise . spécifier le montant sous forme décimale et la devise sous forme d'un enum.

2 votes

J'allais en fait suggérer ceci, mais j'ai fait de la devise une classe pour pouvoir définir un taux de change (par rapport à une "devise de base", souvent le dollar américain [que j'ai défini pour avoir un taux de change de 1,00]).

5 votes

Pour les futurs visiteurs de ce fil (comme moi), il y a maintenant ceci : nuget.org/packages/Money et ça marche !

0 votes

Je me demande si un tel type doit être un struct ou une classe. Une décimale + un enum (int) font 20 octets. Je parie toujours sur le struct.

27voto

SquidScareMe Points 1924

Décimale. Si vous choisissez le double, vous vous exposez à des erreurs d'arrondi.

8 votes

@Jess double peut introduire des erreurs d'arrondi car la virgule flottante ne peut pas représenter tous les nombres exactement (par exemple, 0,01 n'a pas de représentation exacte en virgule flottante). Decimal d'autre part, fait représenter des nombres exactement . (Le compromis est Decimal a une plage plus petite que la virgule flottante) La virgule flottante peut vous donner des erreurs d'arrondi *involontaires* (par ex. 0.01+0.01 != 0.02 ). Decimal peut vous donner des erreurs d'arrondi, mais seulement lorsque vous l'avez demandé (par exemple Math.Round(0.01+0.02) retourne zéro)

2 votes

@IanBoyd : La valeur "1,57 $" peut être représentée précisément (double)157. Si l'on utilise double et applique soigneusement la mise à l'échelle et les arrondis spécifiques au domaine lorsque cela est nécessaire, il peut être parfaitement précis. Si l'on est négligent dans ses arrondis, decimal peut donner des résultats sémantiquement incorrects (par exemple, si l'on additionne plusieurs valeurs qui sont censées être arrondies au centime le plus proche, mais que l'on ne les arrondit pas d'abord). La seule bonne chose à propos de decimal est que la mise à l'échelle est intégrée.

1 votes

@supercat, concernant ce commentaire "si l'on additionne plusieurs valeurs qui sont supposées être arrondies au centime le plus proche, mais qu'on ne les arrondit pas d'abord", je ne vois pas comment un float pourrait résoudre ce problème. Il s'agit d'une erreur de l'utilisateur et cela n'a rien à voir avec les décimales, à mon avis. Je comprends l'argument mais je pense qu'il a été mal placé, principalement parce que IanBoyd l'a spécifié... si vous le demandez.

17voto

dommer Points 11550

Décimal a une plage plus petite, mais une plus grande précision - ainsi vous ne perdez pas tous ces centimes au fil du temps !

Tous les détails ici :

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X