C# 将双精度值转换为二进制值

C# 将双精度值转换为二进制值,c#,binary,types,double,C#,Binary,Types,Double,如何将双精度值转换为二进制值 我在125252525235558554452221545332224587265下面有一些类似的值,我想把它转换成二进制格式。所以我把它保持为双精度,然后尝试转换成二进制(1和0)。。我使用的是C#.net如果你是说你想自己做,那么这不是一个编程问题 如果你想让计算机做这件事,最简单的方法是使用浮点输入例程,然后以十六进制形式显示结果。在C++中: double f = atof ("5.5555555555556E18"); unsigned char *b

如何将双精度值转换为二进制值


我在125252525235558554452221545332224587265下面有一些类似的值,我想把它转换成二进制格式。所以我把它保持为双精度,然后尝试转换成二进制(1和0)。。我使用的是C#.net

如果你是说你想自己做,那么这不是一个编程问题

如果你想让计算机做这件事,最简单的方法是使用浮点输入例程,然后以十六进制形式显示结果。在C++中:

double f = atof ("5.5555555555556E18");
unsigned char  *b = (unsigned char *) &f;
for (int j = 0; j < 8;  ++j)
    printf (" %02x", b [j]);
double f=atof(“5.5555556E18”);
无符号字符*b=(无符号字符*)&f;
对于(int j=0;j<8;++j)
printf(“%02x”,b[j]);

好吧,您还没有指定您感兴趣的平台或二进制值的类型,但是在.NET中,有一个可以让您非常容易地获得组成该值的IEEE 754位

在Java中,有一个函数做同样的事情


请注意,如果您有一个值,例如“125252525235558554452221545332224587265”,那么您得到的信息比double可以准确存储的信息要多。

double值已经是二进制值。这只是一个你们希望它有代表性的问题。在编程语言中,当您将其称为double时,您使用的语言将以一种方式对其进行解释。如果您碰巧将同一块内存称为int,那么它就不是同一个数字


所以这取决于你真正想要什么。。。如果您需要将其写入磁盘或网络,则需要考虑BigEndian/LittleEndian。

在C中,您可以这样做,例如,这是联合结构的经典用法:

int i;
union {
 double x;
 unsigned char byte[sizeof (double)];
} converter;

converter.x = 5.5555555555556e18;

for(i = 0; i < sizeof converter.byte; i++)
  printf("%02x", converter.byte[i]);
当然,请注意,这在其应用程序中依赖于平台。以上内容来自运行在Sempron CPU上的Linux系统,即little endian。

对于这些庞大的数字(不能用双精度表示),您需要使用一些专门的类来保存所需的信息

C#提供十进制类:

十进制值类型表示从正79228162514264337593543950335到负79228162514264337593543950335的十进制数。十进制值类型适用于需要大量有效整数和小数位数且无舍入误差的金融计算。十进制类型并不排除四舍五入的需要。相反,它最大限度地减少了由于舍入而产生的误差。例如,以下代码生成的结果为0.999999999999999999999999,而不是1


如果你需要更高的精度,我想你需要自己制作一个类。这里有一个用于int型的:虽然它看起来是C++的。

你可能想提到8是一个非常具体的数据类型。我不认为IEEE754 64位是C标准要求的。你需要在你的问题上更具体一点。诸如编程语言、CPU、操作系统等细节,以及更多关于您实际尝试实现的内容,将得到更好的答案。我在125252525235558554452221545332224587265下面有一些类似的值,我想把它转换成二进制格式。所以我把它保持为双精度,然后尝试转换成二进制(1和0)。。我使用的是C#.netBTW,这个数字有127位长,所以只能用一个double来近似(很差)。
~/src> gcc -o floatbits floatbits.c
~/src> ./floatbits
ba b5 f6 15 53 46 d3 43