我正在使用C#代码通过以下方式分配十进制值。这些是相同的值还是有区别?
decimal a = 0;
decimal b = 0m;
decimal c = 0.00m;
答案 0 :(得分:4)
只需在其他一些好的答案中添加一些实用信息
十进制具有0
的许多内部表示形式,但是与比较
十进制值的二进制表示形式由一个1位符号组成, 96位整数,以及用于将 96位整数,并指定它的哪一部分是小数。 比例因子隐式为数字10,升为指数 范围从0到28。因此,a的二进制表示形式 小数形式((-296至296)/ 10(0至28)),其中-(296-1) 等于MinValue,并且296-1等于MaxValue。
比例因子还保留小数形式的所有尾随零 数。尾随零不会影响的十进制数的值 算术或比较运算。但是,尾随零可能是 如果合适的格式字符串是ToString方法显示的 已应用。
更改比例因子的示例
string GetBits(decimal d)
{
var bits = decimal.GetBits(d);
return $"{d==0} {d,31} {bits[3],10:X8}{bits[2],10:X8}{bits[1],10:X8}{bits[0],10:X8}";
}
Console.WriteLine(GetBits(0));
Console.WriteLine(GetBits(0.0m));
Console.WriteLine(GetBits(0.000m));
// Manually set the Scaling Factor and Sign
Console.WriteLine(GetBits(new decimal(0,0,0,true,10)));
输出
Equals 0 ToString Other Hi Mid Lo
------------------------------------------------------------------------------
True 0 00000000 00000000 00000000 00000000
True 0.0 00010000 00000000 00000000 00000000
True 0.000 00030000 00000000 00000000 00000000
True 0.0000000000 800A0000 00000000 00000000 00000000
答案 1 :(得分:3)
确实存在区别,但是如果您知道这一点,那可能不会成为问题。
首先,正如本·科特雷尔(Ben Cottrell)在回答中指出的那样,所有这些值都将测试相等。实际上,decimal a = 0;
会将0
的值强制转换为0m
,这实际上使其与b
相同。 a
和b
都将等于0.00m
或小数位数的其他任何形式的测试。
差异之处在于查看内部结构时。仅当将小数序列化为字节数组或使用decimal.GetBits()
返回的数组时,这才真正有意义。在这种情况下,0M
是16 x 0字节,而0.00M
的标度为2,因此二进制表示形式的字节之一(字节14)为非零。
此外,两者的字符串形式将有所不同,因此比较字符串将失败:
decimal a = 0M;
decimal b = 0.00M;
if (a.ToString() != b.ToString())
Console.WriteLine($"'{a}' != '{b}'");
因此,尽管它们相等,但仍然不同。