请帮助我了解Convert和BitConverter之间的区别。在下面的示例中,以上两种方法给了我两个不同的答案:
UInt64 x = 0x4028b0a3d70a3d71;
// Use Convert
double d = Convert.ToDouble(x); // d = 4.6231392352297441E+18
// Use BitConverter
byte[] xArray = BitConverter.GetBytes(x);
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345
谢谢
答案 0 :(得分:1)
这两种方法用于不同的目的。 Convert.ToDouble(x)
等同于强制转换:(double)x
;如果您需要将整数值视为浮点值,例如对于数学运算,这将很有用:
int x = 7;
Console.WriteLine(x / 3); // 2
Console.WriteLine(Convert.ToDouble(x) / 3); // 2.3333333333333335
Console.WriteLine((double)x / 3); // 2.3333333333333335
如果要通过网络以一系列字节的形式传输值, BitConverter 类将很有用;您可以在发送端使用BitConverter.GetBytes()
,在接收端使用BitConverter.To OriginalType ():
double x = 12.345;
byte[] xArray = BitConverter.GetBytes(x);
// Send xArray to another system over the network
// ...on the receiving system, presuming same endianness:
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345
现在,在您的示例中,让我们看一下两种情况下x
的值会发生什么:
UInt64 x = 0x4028b0a3d70a3d71;
// Use Convert
double d = Convert.ToDouble(x); // d = 4.6231392352297441E+18
d
是x
到double
的转换;以十进制形式表示时,科学表示法中的0x4028b0a3d70a3d71 = 4,623,139,235,229,744,497 = 4.623139235229744497 + 18这里没有魔术,这几乎是您期望发生的一切。向前。
// Use BitConverter
byte[] xArray = BitConverter.GetBytes(x);
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345
...什么?好,让我们看看double
类型如何存储在内存中。根据{{3}},格式为:
这里是0x4028b0a3d70a3d71的二进制表示形式,分为我们需要考虑的3个部分:
0 10000000010 1000101100001010001111010111000010100011110101110001
以下公式用于将该存储格式转换为实际数值:
(-1) sign x(1. b 51 b 50 ... b 0 ) base2 x 2 指数-1023
我们可以使用此IEEE 754 specification for double来代替手动进行数学运算;这是结果的快照:
awesome floating point converter
看到小数结果了吗? 12.345,与您从BitConverter.ToDouble(xArray, 0)
获得的内容相同-但肯定与Convert.ToDouble(x)
答案 1 :(得分:0)
第一个: 您可以将 int hex 表示形式转换为double
第二个: 您将x中的值视为 double 的位表示形式,而不是整数。