为什么你不能使用types后缀直接指定一个小数点到十进制types的数字?

为什么你不能使用types后缀直接给十进制types指定一个小数点的数字? 这种数字是不是被认为是小数点数?

decimal bankBalance = 3433.20; // ERROR! 

编辑 :我可能错过了问题的最后部分,所以下面的概述是没有用的。

无论如何,你不能做你想做的是因为在浮点types和decimal之间没有隐式转换。 但是,您可以从一个整数分配它,因为存在从int到decimal的隐式转换。


你可以,但你必须使用这个语法(或者做一个明确的转换为十进制)。

 decimal bankBalance = 3433.20m; 

和漂浮它是

 float bankBalance = 3433.20f; 

默认是双倍

 double bankBalance = 3444.20; 

其实,隐藏的规范function:你可以; – P

 decimal bankBalance = (decimal)3433.20; 

这是由编译器真正parsing为十进制(不是一个浮动和一个强制转换)。 看IL来certificate这一点。 请注意,精度被截断,虽然(这有一个十进制数字,而不是你从M版本得到2)。

IL生成:

 L_0001: ldc.i4 0x861c L_0006: ldc.i4.0 L_0007: ldc.i4.0 L_0008: ldc.i4.0 L_0009: ldc.i4.1 L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8) L_000f: stloc.0 

相比:

 decimal bankBalance = 3433.20M; 

其中生成:

 L_0001: ldc.i4 0x53d18 L_0006: ldc.i4.0 L_0007: ldc.i4.0 L_0008: ldc.i4.0 L_0009: ldc.i4.2 L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8) L_000f: stloc.0 

唯一的区别是十进制数字(1对2,因此10)

这个

 decimal bankBalance = 3433.20M; 

将工作。 原因是float和decimal是非常不同的types。 浮动会给你一个非常接近你input的数字,但十进制会给你确切的数字。 99%的时间你不会注意到的差异,而应该只是使用浮动。

你的答案包括两个重要的点:

  1. 所有带小数点的数字文字都被C#编译器推断为doubletypes,因此3433.20默认为double

  2. double数不会隐式转换为decimal因为虽然decimaldouble精度更精确,但覆盖更短的范围,因此在从双精度到decimal 范围内可以进行溢出。

double范围: ±(~10^−324 to 10^308)有15或16位有效数字。

decimal的范围: ±(~10^-28 to 10^28)有28或29个有效数字。

请参阅十进制的MSDN页面,其中解释了正常浮点types和小数之间没有隐式转换。

尝试

decimal bankBalance = 3433.20m;