c# 将字节转换为精度为 "higher"的 double

标签 c#

我总是使用 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/

相关文章:

c# - 多个左连接的 LINQ 方法语法

c# - 使用 MySql 分配变量

c# - RegistryKey 上次写入时间

c# - Windows 窗体设计器中的设计时错误

c# - 如何在 C# 中将数据从指针复制到指针?

c# - 按降序对数组进行排序的更好方法

c# - 在 ASP.NET Core 中启动 BackgroundService 的正确方法

c# - 命名空间中的 ASP.net c# 可公开访问的函数

c# - 使用联合安全保护服务器应用程序之间的 WCF 服务调用

c# - 为什么当播放器对象被破坏时我的背景音乐停止播放?