decimal l = 50.0M;
我看到过其他答案,建议 M 是将类型显式声明为十进制 - M 在 C# 十进制文字表示法中代表什么?
但是,当变量的类型被专门声明时,为什么要有后缀?当未指定变量的类型时,我可以看到后缀的相关性,例如:
var l = 50.0M
当变量的类型被专门声明时,为什么要有后缀?
仅当要分配的值具有小数点时,才需要强制转换。在您的情况下,50.0
表示类型 double
的文本。您可以通过添加强制转换来避免后缀,如下所示
decimal l = (decimal)50.0; // Do not do this!
但这可能会导致转换错误:
decimal d = (decimal)1.23456789123456789;
Console.WriteLine(d); // Prints 1.23456789123457
decimal e = 1.23456789123456789M;
Console.WriteLine(e); // Prints 1.23456789123456789
请注意,以下内容将在不带后缀或强制转换的情况下进行编译,因为int
到decimal
转换永远不会丢失精度:
decimal l = 50;
您可能希望M
后缀的另一个位置是在操作小数的表达式中:
decimal tenPercentBroken = myDecimal * 0.1; // Does not compile
decimal tenPercentCorrect = myDecimal * 0.1M; // Compiles fine
C# 中的50.0
是一个文字double
,因此如果没有M
后缀,您将尝试将double
隐式转换为decimal
(不存在的隐式转换(。
使用decimal l = 50.0M;
说:将此小数分配给该十进制变量。
原因是因为在赋值语句中首先计算右侧。
右侧的值分配给左侧的变量。因此,必须首先评估右侧,然后查看左侧,如果类型不同,则必须进行石膏转换。