转换小数

时间:2012-01-22 09:59:54

标签: c# algorithm

我有以下字符串:“0x780000105d0e0030” 如果这不是字符串,我可以很容易地得到如下值:

ulong myValue = 0x780000105d0e0030;

给我的值为:8646911354832027696 但是,当我想按如下方式解析它时:

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

给我的价值:8070450566607667200

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

3 个答案:

答案 0 :(得分:3)

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

您实际需要的是Convert.ToUInt64功能。

答案 1 :(得分:3)

Int64签名的 long

改为使用Convert.ToUInt64

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

答案 2 :(得分:2)

您要转换的值在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. 您将字符串“0x7000000000000000”传递给函数。
  3. 我的钱将用于后一种解释。