零有不同的十进制值吗?

时间:2019-04-01 22:38:50

标签: c# decimal

我正在使用C#代码通过以下方式分配十进制值。这些是相同的值还是有区别?

decimal a = 0;
decimal b = 0m;
decimal c = 0.00m;

2 个答案:

答案 0 :(得分:4)

只需在其他一些好的答案中添加一些实用信息

十进制具有0的许多内部表示形式,但是与比较

时,它们都等于

Decimal Struct

  

十进制值的二进制表示形式由一个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相同。 ab都将等于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}'");

因此,尽管它们相等,但仍然不同。