为什么你不能使用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%的时间你不会注意到的差异,而应该只是使用浮动。
你的答案包括两个重要的点:
-
所有带小数点的数字文字都被C#编译器推断为
double
types,因此3433.20
默认为double
。 -
double
数不会隐式转换为decimal
因为虽然decimal
比double
精度更精确,但覆盖更短的范围,因此在从双精度到decimal
范围内可以进行溢出。
double
范围: ±(~10^−324 to 10^308)
有15或16位有效数字。
decimal
的范围: ±(~10^-28 to 10^28)
有28或29个有效数字。
请参阅十进制的MSDN页面,其中解释了正常浮点types和小数之间没有隐式转换。
尝试
decimal bankBalance = 3433.20m;