如何在Java中将小数部分转换为二进制?

idd*_*ber 1 java binary decimal

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

Double.doubleToRawLongBits(0.5)
Run Code Online (Sandbox Code Playgroud)

并且它返回4602678819172646912我猜是十六进制,但它对我没有意义.

jpa*_*cek 6

编号4602678819172646912是十六进制,十六进制是0x3fe0000000000000.要拆除:

   3   |   F   |   E   |  0 ...
0 0 1 1 1 1 1 1 1 1 1 0 0 ...
s|  exponent         |  mantissa
Run Code Online (Sandbox Code Playgroud)

s是符号位,指数是指数偏移2 ^ 9(因此该指数意味着-1),尾数是数字1.xxx的xxx部分(1.暗示).因此,这个数字是1.000 ...*2 ^ -1,即0.5.

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


use*_*421 5

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

示例(快速和++脏):

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();
}
Run Code Online (Sandbox Code Playgroud)