转换小数



例如,我有以下字符串:"0x7800001054.1.1.0030"如果这不是字符串,我可以很容易地得到如下值:

ulong myValue = 0x780000105d0e0030;

这给了我86469113554832027696的价值然而,当我想如下解析它时:

var myValue2= Convert.ToInt64("0x780000105d0e0030",16)

这给了我8070450566607667200 的价值

然后,myValue与myValue2不同。myValue是正确的,它应该是这样工作的。我做错了什么?

Int64有符号long

改为使用Convert.ToUInt64

var myValue2= Convert.ToUInt64("0x780000105d0e0030",16);

myValue为无符号Int64时,myValue2为有符号Int64。

您实际需要的是Convert.ToUInt64函数。

您正在转换的值在Int64的范围内,并转换为等效的Int64值,如以下代码所示:

ulong u = 0x780000105d0e0030;
Console.WriteLine("Convert.ToInt64("0x780000105d0e0030", 16) => {0}", Convert.ToInt64("0x780000105d0e0030", 16));
Console.WriteLine("u                                         => {0}", u);
Console.WriteLine("u.ToString("x")                           => {0}", u.ToString("x"));
Console.WriteLine("Convert.ToInt64(u.ToString("x"), 16)      => {0}", Convert.ToInt64(u.ToString("x"), 16));
Console.WriteLine("u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16)");
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16);
Console.WriteLine("u                                         => {0}", u);

从而产生以下输出:

Convert.ToInt64("0x780000105d0e0030", 16) => 8646911354832027696
u                                         => 8646911354832027696
u.ToString("x")                           => 780000105d0e0030
Convert.ToInt64(u.ToString("x"), 16)      => 8646911354832027696
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16)
u                                         => 8646911354832027696

这就留下了两种可能性:

  1. 你使用的.net版本(我有4.0.30319 RTMRel)在Convert.ToInt64的实现中有一个主要缺陷
  2. 您将字符串"0x70000000000000000"传递给函数

我的钱会花在后一种解释上。

最新更新