23

MSDN 说:

“没有后缀 m,数字被视为双精度数,从而产生编译器错误。”

“M”在什么意思:

decimal current = 10.99M;

代表?

与以下有什么不同:

decimal current = (decimal)10.99
4

3 回答 3

35

M 使数字在代码中成为十进制表示。

要回答您问题的第二部分,是的,它们是不同的。

decimal current = (decimal)10.99

是相同的

double tmp = 10.99;
decimal current = (decimal)tmp;

现在对于大于 sigma 的数字,这应该不是问题,但是如果您指的是十进制,则应该指定十进制。


更新

哇,我错了。我去检查 IL 以证明我的观点,编译器对其进行了优化。


更新 2

毕竟我是对的!,你仍然需要小心。比较这两个函数的输出。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Test1());
        Console.WriteLine(Test2());
        Console.ReadLine();
    }

    static decimal Test1()
    {
        return 10.999999999999999999999M;
    }
    static decimal Test2()
    {
        return (decimal)10.999999999999999999999;
    }
}

第一个返回10.999999999999999999999,但第二个返回11


顺便说一句, double 将为您提供 15 位小数的精度,但 decimal 将为您提供 96 位的精度,比例因子为 0 到 28。所以你可以表示范围内的任何数字 ((-2 96 to 2 96 ) / 10 (0 to 28) )

于 2012-04-18T19:09:03.227 回答
10

描述

decimal current = 10.99M; 

告诉编译器你想要一个十进制数。

decimal current = (decimal)10.99

告诉编译器您要将双精度10.99转换为小数。

有人说它代表金钱。M,因为您必须在金融应用程序中使用小数。您必须使用小数,因为它们比浮点数(双精度)更准确。

小数后缀是 M/m,因为 D/d 已经被 double 取了。尽管有人建议 M 代表金钱,但 Peter Golde 回忆说,M 只是被选为十进制中的下一个最佳字母。

小数比双精度有更多的有效数字,因此它可以更精确——它也占用更多的内存。除了某些数学或物理相关的算法之外,双精度或浮点数应该没问题。

例如

  • 如果您执行 ANYNUMBER / 0.5d,您将不会得到 ANYNUMBER 的一半。

  • 如果你做 ANYNUMBER / 0.5m,你每次都会得到 ANYNUMBER 的一半。

  • decimal为钱而用

  • 用于double汇率

更多信息

于 2012-04-18T19:05:21.397 回答
2

嗯......我认为“D”会与 混淆double,所以......他们选择了“M”?也许是为了“钱”?似乎有点傻......但我找不到任何确定的东西。

于 2012-04-18T19:06:12.407 回答