为什么不在不使用类型后缀的情况下直接将带小数点的数字分配给小数类型?是不是这种数字被认为是一些十进制类型?
decimal bankBalance = 3433.20; // ERROR!
Run Code Online (Sandbox Code Playgroud)
Bri*_*sen 79
编辑:我可能错过了问题的最后部分,因此下面的概述几乎没有用.
无论如何,你不能做你想要做的事情的原因是因为浮点类型之间没有隐式转换decimal.但是,您可以从整数中分配它,因为存在从int到decimal的隐式转换.
您可以,但必须使用此语法(或对十进制执行显式转换).
decimal bankBalance = 3433.20m;
Run Code Online (Sandbox Code Playgroud)
对于浮子来说
float bankBalance = 3433.20f;
Run Code Online (Sandbox Code Playgroud)
默认是双倍
double bankBalance = 3444.20;
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 17
实际上,隐藏的规格功能:你可以;-p
decimal bankBalance = (decimal)3433.20;
Run Code Online (Sandbox Code Playgroud)
这是由编译器真正解析为十进制(不是浮点数和强制转换).请参阅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
Run Code Online (Sandbox Code Playgroud)
相比:
decimal bankBalance = 3433.20M;
Run Code Online (Sandbox Code Playgroud)
哪个产生:
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
Run Code Online (Sandbox Code Playgroud)
唯一的区别是十进制数字(1对2,因此为10)
这个
decimal bankBalance = 3433.20M;
Run Code Online (Sandbox Code Playgroud)
将工作.原因是浮点数和小数是非常不同的类型.float会给你一个非常接近你输入数字的近似值,但decimal会给你一个确切的数字.99%的时间你不会注意到差异,应该只使用浮动.
您的回答包括两个要点:
\n\n所有带有小数点的数字文字都double被 C# 编译器推断为类型,因此默认情况下3433.20是 a 类型double。
double数字不会隐式转换为decimal,因为虽然比decimal它更精确,但double它覆盖的范围更短,因此在从双精度到十进制的转换过程中可能会溢出。
double的范围:\xc2\xb1(~10^\xe2\x88\x92324 to 10^308)有 15 或 16 位有效数字。
decimal的范围:\xc2\xb1(~10^-28 to 10^28)28或29位有效数字。