c#将字节转换为double,具有“更高”的精度

时间:2016-02-20 14:36:59

标签: c#

我总是将字节转换为System.BitConverter.ToDouble()加倍,如下所示:

double value = BitConverter.ToDouble(flt, 0);//flt is an array of bytes.

但是当我尝试转换“8 A 7F DA 0C 41 6D A6 40”(Little Endian)时,它变为2870.62705118949

的确,2870.62705118949是“8 E 7F DA 0C 41 6D A6 40”。

但我想要的是2870.6270511894881565。如何使用C#获得准确的值?

1 个答案:

答案 0 :(得分:5)

使用精确字符串表示时,请使用“R”格式:

https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx

  

“R”或“r”往返结果:一个可以往返的字符串   相同的数字。

在你的情况下

  Byte[] data = { 0x8A, 0x7F, 0xDA, 0x0C, 0x41, 0x6D, 0xA6, 0x40 };

  Double value = BitConverter.ToDouble(data, 0);

  Console.Write(value.ToString("R", CultureInfo.InvariantCulture)); // "R" formatting

正如您所看到的,实际值不是2870.62705118949而是2870.6270511894882;只是比较值:

  2870.6270511894882     Actual
  2870.6270511894881565  You want to have
  2870.62705118949       Proposed by changing 8A into 8E

并且看到“8 A 7F DA 0C 41 6D A6 40”实际上是更好的选择(更准确