为了使用十进制数据类型,我必须使用变量初始化来做到这一点:

decimal aValue = 50.0M;


M部分代表什么?

#1 楼

正如其他人所说,这意味着它是一个十进制文字。但是,起源可能不是该答案中其他地方建议的起源。从C#注释的标准(ECMA版本,而不是MS版本)中:


decimal后缀为M / m,因为double已采用D / d
。 br />尽管有人建议M
代表金钱,但彼得·戈德(Peter Golde)回忆了
,M被简单地选为decimal中的下一个
最佳字母。


类似的注释提到C#的早期版本分别为byteshort文字包括“ Y”和“ S”。之所以删除它们,是因为它们不经常使用。

评论


这就留下了一个问题,为什么E / e不是次佳的字母。

–VVS
09年6月10日在19:14

“ e”会存在问题,因为它已经在文字中使用了。例如,“ 2e4m”是有效文字(十进制20000)。即使它是明确的(而且很可能是这样,尽管“ 1e”最终会出现一个奇怪的编译器错误消息,表明它不在可行的双精度范围内,并不是说它在语法上无效;我怀疑那是个错误),它仍然会令人困惑。 “ c”可能会有意义而不会引起任何混乱,尽管毫无疑问,它会向人们暗示“货币” :)

–乔恩·斯基特(Jon Skeet)
09年6月10日在19:28

“ c”与VB.Net中的字符串的字符文字冲突,尽管语法甚至有所不同。

–乔尔·科恩(Joel Coehoorn)
09年6月10日在19:39

对于C#和VB中的不同,我不会有太多问题。 VB已经具有不同的十六进制语法,例如IIRC。

–乔恩·斯基特(Jon Skeet)
2009年6月10日19:40

如果对“小数”的音节进行布局,则会得到“ De Ci Mal”。这些是最有意义的用法。 D已经被占用,C可能是字符,M似乎是一个合理的选择。

–亚伦·弗兰克(Aaron Franke)
18年2月28日在9:57

#2 楼

根据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
 


请注意,可以使用大写或小写表示法。

#3 楼

M表示“十进制”中的第一个无歧义字符。如果不添加,该数字将被视为双精度数字。

D是双精度数字。

评论


我想有一些重要的原因,但是如果您将m放在字面值之外,则会使您感到编译时错误,这使我感到恼火。这并不是模棱两可。

– SeaDrive
09年7月1日在20:25

@JSON对于整数类型可以这样工作,因为那里没有歧义-只要适合类型,它就不会丢失/乱码任何信息。十进制数字也不一样。将双精度值0.42转换为十进制可以为您提供一个不同于0.42M的值(对于使用双精度常量代替浮点常量也是如此-float val = 423.3也会失败)。因此,您需要在微妙的错误行为和需要半秒钟才能解决并符合CLR和C#标准的编译器错误之间进行选择。

–罗安
18-10-18在8:03

“ M”,就像“ deciMal”中的

– Shadi Namrouti
19-09-15在19:06

#4 楼

带M或m后缀的实数文字是小数(货币)类型。例如,文字1m,1.5m,1e10m和123.456M均为十进制类型。通过获取精确值,可将此文字转换为十进制值,并在必要时使用banker的舍入舍入到最接近的可表示值。除非值四舍五入或值为零(在后一种情况下,符号和小数位将为0),否则保留字面上明显的小数位数。因此,将解析文字2.900m以形成带符号0,系数2900和小数位3的小数。
了解有关真实文字的更多信息

#5 楼

好吧,我想M代表了尾数。十进制可以用来省钱,但这并不意味着十进制仅用于赚钱。

评论


这确实是一种猜测,而且比“第一个可用的非歧义字符”假说的可信度要低得多。如果您有支持的证据,请将其包括在答案中。

–艾舍伍德
19/12/9在22:19