我正在尝试解析.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位小数内。
答案 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