M在C#十进制文字表示法中代表什么?


311

为了使用十进制数据类型,我必须对变量进行初始化:

decimal aValue = 50.0M;

M部分代表什么?

Answers:


386

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

decimal后缀是M /因为d / d已经采取米double。尽管有人建议M代表金钱,但Peter Golde回忆说M只是被简单地选为decimal

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


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

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

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

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

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

27

从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

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


19

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

D是两倍。


4
我想有一些重要的原因,但是让我烦恼的是,如果将m放在字面值之外,则会出现编译时错误。这并不是模棱两可。
SeaDrive

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

1
“ M”,就像在“ deciMal”中一样
Shadi Namrouti

2

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

阅读有关真实文字的更多信息


0

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


这确实是一种猜测,而且比“第一个可用的非歧义字符”假说的可信度要低得多。如果您有支持的证据,请将其包括在答案中。
isherwood '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.