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

时间:2017-03-03 15:30:36

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

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

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

我在nodejs中使用readFloatLE函数尝试了这个函数,它给了我一个Number(双精度值)。

在.net中我只发现了Bitconverter.ToSingle函数,该函数读取二进制32位并给出了一个浮点数,其小数精度(7)小于nodejs解析。

nodejs解析给出了一个povray脚本,其中有一些nubmers:-14.203535079956055 虽然.net只给了我:-14.2035351

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

[编辑]

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

修改

在JavaScript中没有32位浮点数类型。每个number都是双倍的。因此,即使您使用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