以下是双值
-1.2316741412499997E8
以下是我使用的方法:
Long.toBinaryString(Double.doubleToRawLongBits(-1.2316741412499997E8))
output: 1100000110011101010111011000101011011000011111111111111111111110
然而,当我尝试使用值2时,我得到以下输出,如下所示,这是错误的。
Long.toBinaryString(Double.doubleToRawLongBits(2.0))
output: 100000000000000000000000000000000000000000000000000000000000000
有人会告诉我如何将负双值转换为二进制。谢谢。
答案 0 :(得分:5)
我不确定你想要什么结果,但是result for 2.0 is absolutely correct。
请注意,它给出的数字不是零填充,因此它似乎设置了符号位,但位设置是指数的最高位。
答案 1 :(得分:4)
浮点值(例如double)表示与整数值完全不同。从整数值开始,您习惯将它们表示为零填充(对于正数)二进制数,表示基数2中的相同数字。对于浮点值,这不适用。
根据定义,浮点值具有浮动小数点,因此二进制数必须对小数点所在的信息进行编码。这是通过将数字重新整理为以下内容来完成的:
(+/-) x * 2^y whereas 0 <= x < 2 (= 10 base 2)
(+/-)
是需要一点的标志。 x
是尾数,y
是指数。所以二进制表示最后必须编码三个部分。
从0 <= x < 2
开始,x始终以1.something开头,因此1.
不需要在表示中。只保存小数点后的部分,这被认为是有效数字。
在您的示例中,2.0被重新整形为:
+ 1.0 * 2 ^ 1
签名:+ 显着性:0 指数:1
这恰好表示为
0 10000000000 0000000000000000000000000000000000000000000000000000
对于负数,符号为 - 表示为前导1
:
1 10000000000 0000000000000000000000000000000000000000000000000000
请注意,您的原始帖子会列出一个缺少前导0的数字,该数字在数学上是正确的,但在您尝试捕获二进制表示时会产生误导:
10000000000 0000000000000000000000000000000000000000000000000000 =
0 10000000000 0000000000000000000000000000000000000000000000000000
还有一些细节需要了解并牢记在心。例如,指数也可以是负数。您可以在Floating Point Wikipedia article中找到更详细的说明。 joachim引用的binaryconvert.com也可以帮助您理解表示。
答案 2 :(得分:0)
这是你想要的吗?
System.out.println(Long.toBinaryString(Double.valueOf(2.0).longValue()));
System.out.println(Long.toBinaryString(Double.valueOf(-2.0).longValue()));