C# 在.net中将二进制32位IEEE-754浮点转换为双精度浮点
我正在尝试解析.net(C#)中的一个二进制文件,其中包含32位浮点数(IEEE-754) 我需要解析这些数字,然后将这些数字存储在PovRay脚本(一个纯文本文件)中的字符串表示形式中 我在nodejs中尝试了这一点,使用了返回一个数字(双精度值)的函数 在.net中,我只找到了Bitconverter.ToSingle函数,该函数读取二进制32位,并给我一个浮点值,它的十进制精度(7)低于nodejs解析 nodejs解析提供了一个带有如下numer的povray脚本:-14.203535079956055 而.net只给了我:-14.2035351 那么,如何在.net中将二进制32位解析为双精度,以获得更高的精度呢 [编辑] 使用taffer中的anwser:将浮点转换为双精度,然后使用“往返”格式化程序进行字符串表示C# 在.net中将二进制32位IEEE-754浮点转换为双精度浮点,c#,.net,node.js,floating-point,C#,.net,Node.js,Floating Point,我正在尝试解析.net(C#)中的一个二进制文件,其中包含32位浮点数(IEEE-754) 我需要解析这些数字,然后将这些数字存储在PovRay脚本(一个纯文本文件)中的字符串表示形式中 我在nodejs中尝试了这一点,使用了返回一个数字(双精度值)的函数 在.net中,我只找到了Bitconverter.ToSingle函数,该函数读取二进制32位,并给我一个浮点值,它的十进制精度(7)低于nodejs解析 nodejs解析提供了一个带有如下numer的povray脚本:-14.2035350
与nodejs输出相比,仍然存在微小的舍入差异,但这些差异在13-16位小数中。您没有损失任何精度。与JavaScript不同,默认的.NET
ToString
使用常规数字格式,这可能会截断最后的数字
但是,如果您使用以下方法,则会得到准确的结果:
var d = double.Parse("-14.203535079956055");
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055
编辑
在JavaScript中,没有32位浮点数类型。每个数字都是双精度的。因此,即使使用readFloatLE
函数,它也将被解析为32位的双精度。请参见下面的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
是的,那是因为你从双人开始。我在.net:BitConverter.ToSingle中只得到了32位==4个字节==1个浮点。我同意你的答案,可能他在javascript中读取的数字是64位。