如何将double值转换为二进制值。
我有一些像这样的价值125252525235558554452221545332224587265我想将其转换为二进制格式..所以我保持双倍然后尝试转换为二进制(1&amp; 0's)..我正在使用C#.net < / p>
答案 0 :(得分:11)
嗯,你还没有指定一个平台或你感兴趣的二进制值,但是在.NET中BitConverter.DoubleToInt64Bits
可以让你很容易地得到IEEE 754位的值。
在Java中,Double.doubleToLongBits
执行相同的操作。
请注意,如果您有一个值,例如“125252525235558554452221545332224587265”,那么您可以获得的信息比双头可以准确存储的信息更多。
答案 1 :(得分:6)
在C中,你可以这样做,这是union
结构的经典用法:
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]);
如果您将其粘贴在main()
并运行它,它可能会打印出类似这样的内容:
~/src> gcc -o floatbits floatbits.c
~/src> ./floatbits
ba b5 f6 15 53 46 d3 43
请注意,当然,这在endianness中依赖于平台。以上内容来自在Sempron CPU上运行的Linux系统,即它的小端。
答案 2 :(得分:0)
如果你的意思是你想自己做,那么这不是一个编程问题。
如果您想让计算机执行此操作,最简单的方法是使用浮点输入例程,然后以十六进制形式显示结果。在C ++中:
double f = atof ("5.5555555555556E18");
unsigned char *b = (unsigned char *) &f;
for (int j = 0; j < 8; ++j)
printf (" %02x", b [j]);
答案 3 :(得分:0)
双值已经是二进制值。这只是你希望它具有的表现形式的问题。在编程语言中,当您将其称为double时,您使用的语言将以一种方式解释它。如果碰巧将同一块内存调用为int,那么它的数字就不一样了。
所以这取决于你真正想要的......如果你需要将它写入磁盘或网络,那么你需要考虑BigEndian / LittleEndian。
答案 4 :(得分:0)
晚了十年,但希望这会对某人有所帮助:
// Converts a double value to a string in base 2 for display.
// Example: 123.5 --> "0:10000000101:1110111000000000000000000000000000000000000000000000"
// Created by Ryan S. White in 2020, Released under the MIT license.
string DoubleToBinaryString(double val)
{
long v = BitConverter.DoubleToInt64Bits(val);
string binary = Convert.ToString(v, 2);
return binary.PadLeft(64, '0').Insert(12, ":").Insert(1, ":");
}
答案 5 :(得分:-1)
对于这些庞大的数字(无法使用双精确表示),您需要使用一些专门的类来保存所需的信息。
C#提供了Decimal类:
十进制值类型表示十进制数,范围从正数79,228,162,514,264,337,593,543,950,335到负数79,228,162,514,264,337,593,543,950,335。 Decimal值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算。 Decimal类型不会消除舍入的需要。相反,它最大限度地减少了因舍入而导致的错误。例如,以下代码生成的结果为0.9999999999999999999999999999而不是1.
如果你需要比这更大的精度,我猜你需要自己上课。这里有一个用于整理:http://sourceforge.net/projects/cpp-bigint/虽然它似乎适用于c ++。