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

我试图parsing一个二进制STereoLithography文件(.stl) .net(C#),其中有32位浮点数(IEEE-754)在其中。

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

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

在.net中,我只findBitconverter.ToSingle函数读取二进制32位,并给我一个比nodejsparsingless一个精度(7)的浮点数。

nodejsparsing提供了一个povray脚本nubmers像:-14.203535079956055虽然.net只给我:-14.2035351

那么,如何将二进制32位parsing为.net中的Double来获得更高的精度呢?

[编辑]

使用taffer中的anwser:将转换后的float转换为double,然后使用“往返”格式化程序进行string表示。

与nodejs输出相比,仍然有小的舍入差异,但是那些在十三到十六位小数。

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

但是,如果您使用往返格式说明符,您将得到确切的结果:

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

编辑

在JavaScript中没有32位浮点数types。 每个number是一个双。 所以,即使你使用readFloatLE函数,它也会被parsing为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