我总是使用 System.BitConverter.ToDouble()
将字节转换为 double ,如下所示:
double value = BitConverter.ToDouble(flt, 0);//flt is an array of bytes.
但是当我尝试转换“8A 7F DA 0C 41 6D A6 40”(Little Endian)时,它变成了 2870.62705118949
。
确实,2870.62705118949
是“8E 7F DA 0C 41 6D A6 40”。
但我想要的是2870.6270511894881565
。如何使用C#获取准确的值?
最佳答案
使用精确字符串表示时,使用“R”格式:
https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx
"R" or "r" Round-trip Result: A string that can round-trip to an identical number.
在你的情况下
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
并看到“8A 7F DA 0C 41 6D A6 40”实际上是更好的选择(更准确)
关于c# 将字节转换为精度为 "higher"的 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524709/