Как мне преобразовать десятичную дробь в двоичную в Java? - PullRequest
1 голос
/ 16 апреля 2009

Мне нужно конвертировать 0,5 в базе 10 в базу 2 (0,1). Я пытался использовать

Double.doubleToRawLongBits(0.5)

и он возвращает 4602678819172646912, который, я думаю, находится в шестнадцатеричном виде, но для меня это не имеет смысла.

Ответы [ 5 ]

6 голосов
/ 16 апреля 2009

Нет. 4602678819172646912 в декабрь, шестнадцатеричный 0x3fe0000000000000. Чтобы разобрать это:

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

s - знаковый бит, показатель степени - показатель степени, сдвинутый на 2 ^ 9 (отсюда этот показатель означает -1), мантисса - часть xxx числа 1.xxx (подразумевается 1.). Следовательно, это число составляет 1000 ... * 2 ^ -1, что составляет 0,5.

Обратите внимание, что здесь описываются только "нормальные" числа, поэтому нет нулей, денормалов, NaN или бесконечностей

5 голосов
/ 16 апреля 2009

Умножьте свое число на 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();
}
1 голос
/ 16 апреля 2009

Это десятичное число для 0x3FE0_0000_0000_0000. Мантисса - это список нулей после 3FE (который кодирует знак и показатель степени). Это то, что вы ищете, учитывая, что 0,1 до нулей неявно.

0 голосов
/ 17 апреля 2009

Вы хотите преобразовать десятичную строку в двоичную или в двоичную строку? Если первое, просто используйте valueOf (); если последнее, используйте valueOf (), а затем toString () или printf ().

0 голосов
/ 16 апреля 2009

0.1 НЕ является двоичным представлением 0,5

Java будет представлять 0,5 с использованием IEEE 754, как указано в Спецификации языка Java . BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray() даст вам представление байта на байт 0,5, как это делает внутренне Java.

...