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

312

Afin de travailler avec des types de données décimaux, je dois le faire avec une initialisation variable:

decimal aValue = 50.0M;

Que représente la partie M?

coson
la source

Réponses:

387

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. À partir de la norme annotée C # (la version ECMA, pas la version MS):

Le decimalsuffixe est M / m car D / d a déjà été pris par double. Bien qu'il ait été suggéré que M représente de l'argent, Peter Golde rappelle que M a été choisi simplement comme la meilleure lettre suivante decimal.

Une annotation similaire mentionne que les premières versions de C # incluaient respectivement "Y" et "S" pour byteet shortlittéraux. Ils ont été abandonnés au motif de ne pas être utiles très souvent.

Jon Skeet
la source
6
Cela laisse la question de savoir pourquoi E / e n'était pas la meilleure lettre suivante.
VVS
61
"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'était pas ambigu (et il se pourrait bien que, bien que "1e" se termine par un curieux message d'erreur du compilateur suggérant qu'il est hors de portée des doubles viables, pas que ce soit syntaxiquement invalide; je soupçonne que c'est un bogue), il serait toujours déroutant. "c" aurait probablement du sens sans causer de confusion, bien qu'il suggérerait sans aucun doute une "devise" aux gens :)
Jon Skeet
7
"c" entre en conflit avec le littéral de caractère pour les chaînes dans VB.Net, bien que même là, la grammaire soit un peu différente.
Joel Coehoorn
3
Je n'aurais pas trop de problème avec le fait qu'il soit différent en C # et VB. VB a déjà une syntaxe hexadécimale différente, par exemple, IIRC.
Jon Skeet
9
Si vous disposez les syllabes de "Decimal", vous obtenez "De Ci Mal". Ceux-ci sont les plus judicieux à utiliser. D est déjà pris, C pourrait être des caractères, M semble être un choix logique.
Aaron Franke
27

D'après les 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 majuscule ou minuscule.

Shadi Namrouti
la source
19

M fait référence au premier caractère non ambigu en "décimal". Si vous ne l'ajoutez pas, le nombre sera traité comme un double.

D est double.

MDStephens
la source
4
Je suppose qu'il y a une raison importante, mais cela m'énerve 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.
SeaDrive
1
@JSON Cela fonctionne de cette façon pour les types entiers, car il n'y a aucune ambiguïté - tant qu'il correspond au type, il ne perdra / ne déformera aucune information. Il n'en va pas de même pour les nombres décimaux. La conversion de la valeur double 0.42en décimale peut vous donner une valeur différente de 0.42M(et la même chose pour l'utilisation d'un double littéral à la place d'un littéral flottant - float val = 423.3échoue également). Vous choisissez donc entre un comportement subtilement erroné et une erreur de compilation qui prend une demi-seconde à corriger et est conforme aux normes CLR et C #.
Luaan
1
"M", comme dans "deciMal"
Shadi Namrouti
2

Un vrai littéral suffixé par M ou m est de type décimal. Par exemple, les littéraux 1m, 1,5m, 1e10m et 123,456M sont tous de type décimal. Ce littéral est converti en valeur décimale en prenant la valeur exacte et, si nécessaire, en arrondissant à la valeur représentable la plus proche en utilisant l'arrondi bancaire. Toute échelle apparente dans le littéral est conservée sauf si la valeur est arrondie ou la valeur est zéro (dans ce dernier cas, le signe et l'échelle seront 0). Par conséquent, le littéral 2.900m sera analysé pour former la décimale avec le signe 0, le coefficient 2900 et l'échelle 3.

En savoir plus sur les vrais littéraux

LuckyBrain
la source
0

Eh bien, je suppose que M représente la mantisse. Décimal peut être utilisé pour économiser de l'argent, mais cela ne signifie pas, décimal uniquement utilisé pour de l'argent.

Ashvani mishra
la source
C'est en effet une supposition, et elle est beaucoup moins plausible que l'hypothèse du "premier caractère non ambigu disponible". Si vous avez des preuves à l'appui, incluez-les dans votre réponse.
isherwood