为什么不使用类型后缀直接将带小数点的数字直接分配给小数类型?是不是这种数字被认为是一些十进制数?
decimal bankBalance = 3433.20; // ERROR!
答案 0 :(得分:72)
修改:我可能错过了问题的最后部分,因此下面的概述几乎没用。
无论如何,你不能做你想做的事情的原因是因为浮点类型和decimal
之间没有隐式转换。但是,您可以从整数中分配它,因为存在从int到decimal的隐式转换。
您可以,但必须使用此语法(或对十进制执行显式转换)。
decimal bankBalance = 3433.20m;
对于花车而言
float bankBalance = 3433.20f;
默认为双
double bankBalance = 3444.20;
答案 1 :(得分:16)
实际上,隐藏的规范功能:你可以;-p
decimal bankBalance = (decimal)3433.20;
这是由编译器真正解析为十进制(不是浮点数和强制转换)。请参阅IL来证明这一点。请注意,精度会被截断(这有1个十进制数字,而不是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)
答案 2 :(得分:5)
此
decimal bankBalance = 3433.20M;
会奏效。原因是浮点数和小数是非常不同的类型。 float会给你一个非常接近你输入数字的近似值,但decimal会给你一个确切的数字。 99%的时间你不会注意到差异,应该只使用浮动。
答案 3 :(得分:4)
您的回答包含两个要点:
C#编译器推断出所有带小数点的数字文字属于double
类型,因此3433.20
默认为double
。
double
数字不会隐式转换为decimal
,因为虽然decimal
比double
更准确,但它涵盖 更短的范围< / em> 因此在从双精度到十进制的演员表中可以溢出。
double
的范围:±(~10^−324 to 10^308)
,有15或16位有效数字。
decimal
的范围:±(~10^-28 to 10^28)
,有28或29位有效数字。
答案 4 :(得分:3)