为什么不在不使用类型后缀的情况下直接将带小数点的数字分配给小数类型?是不是这种数字被认为是一些十进制类型?
decimal bankBalance = 3433.20; // ERROR!
Brian Rasmus.. 79
编辑:我可能错过了问题的最后部分,因此下面的概述几乎没有用.
无论如何,你不能做你想要做的事情的原因是因为浮点类型之间没有隐式转换decimal
.但是,您可以从整数中分配它,因为存在从int到decimal的隐式转换.
您可以,但必须使用此语法(或对十进制执行显式转换).
decimal bankBalance = 3433.20m;
对于浮子来说
float bankBalance = 3433.20f;
默认是双倍
double bankBalance = 3444.20;
Marc Gravell.. 17
实际上,隐藏的规格功能:你可以;-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)
编辑:我可能错过了问题的最后部分,因此下面的概述几乎没有用.
无论如何,你不能做你想要做的事情的原因是因为浮点类型之间没有隐式转换decimal
.但是,您可以从整数中分配它,因为存在从int到decimal的隐式转换.
您可以,但必须使用此语法(或对十进制执行显式转换).
decimal bankBalance = 3433.20m;
对于浮子来说
float bankBalance = 3433.20f;
默认是双倍
double bankBalance = 3444.20;
实际上,隐藏的规格功能:你可以;-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)
这个
decimal bankBalance = 3433.20M;
将工作.原因是浮点数和小数是非常不同的类型.float会给你一个非常接近你输入数字的近似值,但decimal会给你一个确切的数字.99%的时间你不会注意到差异,应该只使用浮动.