Wofür steht das M in der C # -Dezimal-Literalschreibweise?

312

Um mit dezimalen Datentypen arbeiten zu können, muss ich dies mit variabler Initialisierung tun:

decimal aValue = 50.0M;

Wofür steht der M-Teil?

coson
quelle

Antworten:

387

Es bedeutet, dass es ein Dezimal-Literal ist, wie andere gesagt haben. Die Ursprünge sind jedoch wahrscheinlich nicht die an anderer Stelle in dieser Antwort vorgeschlagenen. Aus dem C # Annotated Standard (die ECMA-Version, nicht die MS-Version):

Das decimalSuffix ist M / m, da D / d bereits von übernommen wurde double. Obwohl vermutet wurde, dass M für Geld steht, erinnert sich Peter Golde, dass M einfach als nächstbester Buchstabe in ausgewählt wurde decimal.

In einer ähnlichen Anmerkung wird erwähnt, dass frühe Versionen von C # "Y" und "S" für bytebzw. shortLiterale enthielten . Sie wurden fallen gelassen, weil sie nicht sehr oft nützlich waren.

Jon Skeet
quelle
6
Das lässt die Frage offen, warum E / E nicht der nächstbeste Brief war.
VVS
61
"e" wäre insofern problematisch, als es bereits in Literalen verwendet wird. Zum Beispiel ist "2e4m" ein gültiges Literal (dezimal 20000). Selbst wenn es eindeutig wäre (und es könnte durchaus sein, dass "1e" eine merkwürdige Compiler-Fehlermeldung enthält, die darauf hinweist, dass es außerhalb des Bereichs realisierbarer Doubles liegt, nicht, dass es syntaktisch ungültig ist; ich vermute, dass dies ein Fehler ist), wäre es dennoch verwirrend. "c" würde möglicherweise Sinn machen, ohne Verwirrung zu stiften, obwohl es zweifellos "Währung" für Leute bedeuten würde :)
Jon Skeet
7
"c" widerspricht dem Zeichenliteral für Zeichenfolgen in VB.Net, obwohl selbst dort die Grammatik etwas anders ist.
Joel Coehoorn
3
Ich hätte nicht allzu viele Probleme damit, dass es in C # und VB anders ist. VB hat bereits eine andere Hex-Syntax, zum Beispiel IIRC.
Jon Skeet
9
Wenn Sie die Silben von "Dezimal" auslegen, erhalten Sie "De Ci Mal". Diese sind am sinnvollsten zu verwenden. D ist bereits vergeben, C könnte Zeichen sein, M scheint eine logische Wahl zu sein.
Aaron Franke
27

Aus C # -Spezifikationen:

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

Beachten Sie, dass Sie eine Groß- oder Kleinschreibung verwenden können.

Shadi Namrouti
quelle
19

M bezieht sich auf das erste nicht mehrdeutige Zeichen in "Dezimal". Wenn Sie es nicht hinzufügen, wird die Zahl als Doppel behandelt.

D ist doppelt.

MDStephens
quelle
4
Ich nehme an, es gibt einen wichtigen Grund, aber es irritiert mich, dass Sie einen Fehler bei der Kompilierung erhalten, wenn Sie das m aus dem Literal herauslassen. Es ist nicht so, als wäre es mehrdeutig.
SeaDrive
1
@JSON Dies funktioniert bei ganzzahligen Typen auf diese Weise, da dort keine Mehrdeutigkeit besteht. Solange es zum Typ passt, gehen keine Informationen verloren / verstümmeln. Gleiches gilt nicht für Dezimalzahlen. Wenn Sie den Doppelwert 0.42in eine Dezimalzahl umwandeln, erhalten Sie möglicherweise einen anderen Wert als 0.42M(und dasselbe gilt für die Verwendung eines Doppelliteral anstelle eines Float-Literal - float val = 423.3schlägt ebenfalls fehl). Sie wählen also zwischen einem subtil falschen Verhalten und einem Compilerfehler, dessen Behebung eine halbe Sekunde dauert und den CLR- und C # -Standards entspricht.
Luaan
1
"M", wie in "deciMal"
Shadi Namrouti
2

Ein reales Literal mit dem Suffix M oder m ist vom Typ Dezimal. Beispielsweise sind die Literale 1 m, 1,5 m, 1e10 m und 123,456 m alle vom Typ Dezimal. Dieses Literal wird in einen Dezimalwert umgewandelt, indem der genaue Wert genommen und gegebenenfalls mithilfe der Bankrundung auf den nächsten darstellbaren Wert gerundet wird. Jede im Literal sichtbare Skala bleibt erhalten, es sei denn, der Wert ist gerundet oder der Wert ist Null (in letzterem Fall sind Vorzeichen und Skala 0). Daher wird das Literal 2.900 m analysiert, um die Dezimalstelle mit Vorzeichen 0, Koeffizient 2900 und Skala 3 zu bilden.

Lesen Sie mehr über echte Literale

LuckyBrain
quelle
0

Nun, ich denke M repräsentiert die Mantisse. Dezimal kann verwendet werden, um Geld zu sparen, aber das bedeutet nicht, dass Dezimalzahl nur für Geld verwendet wird.

Ashvani Mishra
quelle
Das ist in der Tat eine Vermutung und viel weniger plausibel als die Hypothese "erster verfügbarer nicht mehrdeutiger Charakter". Wenn Sie Belege haben, nehmen Sie diese in Ihre Antwort auf.
Isherwood