1

我需要将基数 10 中的 0.5 转换为基数 2 (0.1)。我试过使用

Double.doubleToRawLongBits(0.5)

它返回4602678819172646912我猜是十六进制的,但对我来说没有意义。

4

5 回答 5

6

编号 4602678819172646912 为 dec,十六进制为 0x3fe0000000000000。要拆除它:

   3   |   F   |   E   |  0 ...
0 0 1 1 1 1 1 1 1 1 1 0 0 ...
s|  exponent         |  mantissa

s 是符号位,exponent 是移动了 2^9 的指数(因此这个指数意味着 -1),尾数是数字 1.xxx 的 xxx 部分(隐含 1.)。因此,这个数字是 1.000...*2^-1,也就是 0.5。

请注意,这仅描述“正常”数字,因此没有零、非规范、NaN 或无穷大

于 2009-04-16T14:51:26.547 回答
5

将您的数字乘以 2^n,转换为 BigInteger,转换为二进制字符串,在位置 n(从右到左)添加一个小数点。

示例(快速和 ++dirty):

private static String convert(double number) {
    int n = 10;  // constant?
    BigDecimal bd = new BigDecimal(number);
    BigDecimal mult = new BigDecimal(2).pow(n);
    bd = bd.multiply(mult);
    BigInteger bi = bd.toBigInteger();
    StringBuilder str = new StringBuilder(bi.toString(2));
    while (str.length() < n+1) {  // +1 for leading zero
        str.insert(0, "0");
    }
    str.insert(str.length()-n, ".");
    return str.toString();
}
于 2009-04-16T15:39:57.387 回答
1

这是十进制的0x3FE0_0000_0000_0000。尾数是 3FE 之后的零列表(编码符号和指数)。这就是您要查找的内容,因为零之前的 0.1 是隐含的。

于 2009-04-16T14:45:57.463 回答
0

要将十进制字符串转换为浮点二进制还是二进制字符串?如果是前者,只需使用 valueOf(); 如果是后者,使用 valueOf() 后跟 toString() 或 printf()。

于 2009-04-17T02:35:58.370 回答
-2

0.1 不是 0.5 的二进制表示

Java 将使用 IEEE 754 表示 0.5,如Java Language Specification中所指定。BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()正如 Java 在内部所做的那样,将为您提供 0.5 的每字节表示。

于 2009-04-16T14:56:36.503 回答