439 votes

Que signifie le M dans la notation littérale décimale C# ?

Afin de travailler avec des types de données décimales, je dois le faire avec l'initialisation des variables :

decimal aValue = 50.0M;

Que signifie la partie M ?

525voto

Jon Skeet Points 692016

Cela signifie que c'est un littéral décimal, comme d'autres l'ont dit. Cependant, les origines ne sont probablement pas celles suggérées ailleurs dans cette réponse. De la C# Annotated Standard (la version ECMA, pas la version MS) :

El decimal Le suffixe est M/m puisque D/d était déjà pris par double . Bien qu'il ait été suggéré que M représente l'argent, Peter Golde rappelle que M a été choisi simplement comme la prochaine meilleure lettre dans decimal .

Une annotation similaire mentionne que les premières versions de C# comprenaient "Y" et "S" pour byte y short respectivement. Ils ont été abandonnés au motif qu'ils n'étaient pas souvent utiles.

15 votes

Cela laisse la question de savoir pourquoi E/e n'était pas la meilleure lettre suivante.

89 votes

"e" serait problématique dans la mesure où il est déjà utilisé dans les littéraux. Par exemple, "2e4m" est un littéral valide (décimal 20000). Même s'il n'y avait pas d'ambiguïté (et cela pourrait bien être le cas, bien que "1e" donne lieu à un curieux message d'erreur du compilateur suggérant qu'il est hors de la plage des doubles viables, et non qu'il est syntaxiquement invalide ; je soupçonne qu'il s'agit d'un bogue), il serait toujours source de confusion. "c" aurait peut-être du sens sans causer de confusion, bien que cela suggérerait sans doute "monnaie" aux gens :)

11 votes

"c" entre en conflit avec le caractère littéral pour les chaînes de caractères dans VB.Net, bien que même là, la grammaire soit un peu différente.

123voto

Shadi Namrouti Points 1453

A partir des spécifications C# :

var f = 0f; // float
var d = 0d; // double
var m = 0m; // decimal (money)
var u = 0u; // unsigned int
var l = 0l; // long
var ul = 0ul; // unsigned long

Notez que vous pouvez utiliser une notation en majuscules ou en minuscules.

34voto

MDStephens Points 256

M désigne le premier caractère non ambigu de "décimal". Si vous ne l'ajoutez pas, le nombre sera traité comme un double.

D comme double.

6 votes

Je suppose qu'il y a une raison importante, mais cela m'irrite que vous obteniez une erreur de compilation si vous laissez le m hors du littéral. Ce n'est pas comme si c'était ambigu.

4 votes

@JSON Cela fonctionne de cette façon pour les types d'entiers, car il n'y a pas d'ambiguïté - tant que cela correspond au type, aucune information ne sera perdue ou tronquée. Il n'en va pas de même pour les nombres décimaux. Conversion de la valeur double 0.42 en décimal peut vous donner une valeur différente que 0.42M (et il en va de même pour l'utilisation d'un double littéral au lieu d'un littéral flottant). float val = 423.3 échoue également). Vous devez donc choisir entre un comportement subtilement erroné et une erreur de compilation qui prend une demi-seconde à corriger et qui est conforme au CLR et aux normes C#.

3 votes

"M", comme dans "déciMal"

20voto

Lucky Brain Points 1241

Un littéral réel suffixé par M ou m est de type décimal (monnaie) . Par exemple, les littéraux 1m, 1,5m, 1e10m et 123,456M sont tous de type décimal. Ce littéral est converti en une valeur décimale en prenant la valeur exacte et, si nécessaire, en l'arrondissant à la valeur représentable la plus proche en utilisant l'arrondi du banquier. Toute échelle apparente dans le littéral est préservée, sauf si la valeur est arrondie ou si la valeur est nulle (dans ce dernier cas, le signe et l'échelle seront 0). Ainsi, le littéral 2,900 m sera analysé pour former la décimale avec le signe 0, le coefficient 2900 et l'échelle 3.

En savoir plus sur les littéraux réels

6voto

Joel Coehoorn Points 190579

Voir ceci (écrit par notre propre Jon Skeet) :
http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88466.aspx

et ceci (plus de détails) :
http://www.blackwasp.co.uk/CSharpNumericLiterals.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