为什么不能直接将带小数点的数字分配给十进制类型而不使用类型后缀?

时间:2009-01-27 20:51:55

标签: c#

为什么不使用类型后缀直接将带小数点的数字直接分配给小数类型?是不是这种数字被认为是一些十进制数?

decimal bankBalance = 3433.20; // ERROR!

5 个答案:

答案 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)

您的回答包含两个要点:

  1. C#编译器推断出所有带小数点的数字文字属于double类型,因此3433.20默认为double

  2. double数字不会隐式转换为decimal,因为虽然decimaldouble更准确,但它涵盖 更短的范围< / em> 因此在从双精度到十进制的演员表中可以溢出。

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

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

答案 4 :(得分:3)

请参阅decimal上的MSDN页面,该页面解释了普通浮点类型和小数之间没有隐式转换。

尝试

decimal bankBalance = 3433.20m;