C# 十进制文字符号中的 M 代表啥?
Posted
技术标签:
【中文标题】C# 十进制文字符号中的 M 代表啥?【英文标题】:What does the M stand for in C# Decimal literal notation?C# 十进制文字符号中的 M 代表什么? 【发布时间】:2010-11-01 22:12:56 【问题描述】:为了使用十进制数据类型,我必须通过变量初始化来做到这一点:
decimal aValue = 50.0M;
M 部分代表什么?
【问题讨论】:
【参考方案1】:以 M 或 m 为后缀的实数文字是 decimal (money) 类型。例如,文字 1m、1.5m、1e10m 和 123.456M 都是十进制类型。该文字通过取确切值转换为十进制值,并在必要时使用银行四舍五入四舍五入到最接近的可表示值。除非值被四舍五入或值为零(在后一种情况下,符号和比例将为 0),否则文字中明显的任何比例都会被保留。因此,文字 2.900m 将被解析为符号 0、系数 2900 和小数位数 3 的小数。
Read more about real literals
【讨论】:
【参考方案2】:M 指“十进制”中的第一个非歧义字符。如果您不添加它,则该数字将被视为双精度数。
D 是双倍的。
【讨论】:
我想有一些重要的原因,但如果你把 m 排除在文字之外,你会得到一个编译时错误,这让我很恼火。这不是模棱两可的。 @JSON 它适用于整数类型,因为那里没有歧义 - 只要它适合类型,它就不会丢失/混淆任何信息。十进制数也不是这样。将双精度值0.42
转换为十进制可以为您提供与 0.42M
不同的值(使用双精度文本代替浮点文本也是如此 - float val = 423.3
也会失败)。因此,您要在一个微妙的错误行为和一个需要半秒钟才能修复并符合 CLR 和 C# 标准的编译器错误之间进行选择。
“M”,如“十进制”【参考方案3】:
来自 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
请注意,您可以使用大写或小写符号。
【讨论】:
【参考方案4】:嗯,我猜 M 代表尾数。小数可以用来省钱,但不代表小数只用来存钱。
【讨论】:
这确实是一个猜测,而且它比“第一个可用的非歧义字符”假设更不可信。如果您有支持性证据,请将其包含在您的答案中。【参考方案5】:正如其他人所说,这意味着它是十进制文字。但是,起源可能不是此答案中其他地方建议的起源。来自C# Annotated Standard(ECMA 版本,不是 MS 版本):
decimal
后缀是 M/m,因为 D/d 已被double
拍摄。 虽然有人建议 M 代表金钱,彼得·戈尔德回忆说 M 被简单地选为下一个decimal
中的最佳字母。
一个类似的注释提到 C# 的早期版本分别包含 byte
和 short
文字的“Y”和“S”。它们因不经常使用而被丢弃。
【讨论】:
这就留下了为什么 E/e 不是下一个最好的字母的问题。 "e" 会有问题,因为它已经在文字中使用了。例如“2e4m”是一个有效的文字(十进制 20000)。即使它是明确的(很可能是,尽管“1e”最终会出现一个奇怪的编译器错误消息,表明它超出了可行的双精度范围,而不是它在语法上无效;我怀疑这是一个错误)它仍然是令人困惑。 "c" 可能是有意义的,不会引起任何混淆,尽管它无疑会向人们暗示“货币”:) "c" 与 VB.Net 中字符串的字符文字冲突,尽管语法略有不同。 我不会有太多问题,因为它在 C# 和 VB 中有所不同。 VB 已经有不同的十六进制语法,例如 IIRC。 如果你把“Decimal”的音节排好,你会得到“De Ci Mal”。这些使用起来最有意义。 D 已经被占用,C 可以是字符,M 似乎是一个合乎逻辑的选择。以上是关于C# 十进制文字符号中的 M 代表啥?的主要内容,如果未能解决你的问题,请参考以下文章