c# - 将二进制 32 位 IEEE-754 浮点转换为 .net 中的 Double

标签 c# .net node.js floating-point

我正在尝试解析二进制文件 STereoLithography file(.stl)在.net(C#)中,其中包含32位 float (IEEE-754)。

我需要解析这些数字,然后将这些数字存储在 PovRay 脚本中的字符串表示形式,这是一个纯文本文件。

我使用readFloatLE在nodejs中尝试了这个函数返回一个数字( double 值)。

在.net中,我只找到了Bitconverter.ToSingle函数,它读取二进制32位并给我一个 float ,其十进制精度(7)比nodejs解析的要低。

nodejs 解析给出了一个 povray 脚本,其数字如下:-14.203535079956055 虽然.net只给了我:-14.2035351

那么,如何在.net中将二进制32位解析为Double以获得更高的精度?

[编辑]

使用 taffer 中的 anwser:将 float 转换为 double,然后使用“round-trip”格式化程序进行字符串表示。

与nodejs输出相比,仍然存在较小的舍入差异,但这些差异在小数点后第13-16位。

最佳答案

您没有失去任何精度。与 JavaScript 不同,默认的 .NET ToString 使用通用数字格式,这可能会截断最后的数字。

但是如果你使用round-trip format specifier你会得到确切的结果:

var d = double.Parse("-14.203535079956055");
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

编辑

在 JavaScript 中,没有 32 位 float 类型。每个数字都是 double 。因此,即使您使用 readFloatLE 函数,它也会被解析为 32 位的 double 。请参阅下面的 C# 代码,它演示了实际发生的情况:

var d = (double)float.Parse("-14.2035351");
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

或者更准确地说,如果您从字节缓冲区读取数字:

var d = (double)BitConverter.ToSingle(new byte[] { 174,65,99,193 }, 0);
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

关于c# - 将二进制 32 位 IEEE-754 浮点转换为 .net 中的 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42582778/

相关文章:

javascript - 我们如何在 Node 中设置总请求超时或丢弃请求(使用集群模块时)?

.net - DotNetOpenAuth 导致无法加载程序集 System.Web.WebPages.Razor

c# - 如何隐藏 SplitContainer 上的面板?

javascript - 为什么以及何时使用 process.nextTick?

c# - 将 ToListAsync() 与 Automapper ProjectToQueryable() 结合使用

c# - 如何从 WPF 应用程序方法运行 Windows 服务应用程序

node.js - 构建我的 Mongoose 模式 : embedded array , 填充的最佳方法,子文档?

c# - 在 "ilc.exe"模式下编译时,"Release"退出代码 1104

c# - 遍历 TabControl 中的 TabItems

c# - Orchard CMS 部分放置