1

基数 10 の 0.5 を基数 2 (0.1) に変換する必要があります。使ってみました

Double.doubleToRawLongBits(0.5)

そして、それは460267881917264691216進数であると思いますが、私には意味がありません。

4

5 に答える 5

6

No. 4602678819172646912 は 10 進数、16 進数は 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 を意味します)、仮数は数値 1.xxx の xxx 部分です (1. は暗示されます)。したがって、この数値は 1.000...*2^-1、つまり 0.5 です。

これは「通常の」数値のみを説明しているため、ゼロ、デノーマル、NaN、または無限大は含まれていないことに注意してください。

于 2009-04-16T14:51:26.547 に答える
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();
}
于 2009-04-16T15:39:57.387 に答える
1

これは の 10 進数です0x3FE0_0000_0000_0000。仮数は、3FE (符号と指数をコード化) の後のゼロのリストです。ゼロの前の 0.1 が暗黙的であることを考えると、これはあなたが探しているものです。

于 2009-04-16T14:45:57.463 に答える
0

10 進文字列を浮動小数点バイナリまたはバイナリ文字列に変換しますか? 前者の場合は、valueOf(); を使用してください。後者の場合は、valueOf() の後に toString() または printf() を使用します。

于 2009-04-17T02:35:58.370 に答える
-2

0.1 は 0.5 のバイナリ表現ではありません

Java は、 Java 言語仕様で指定されているように、IEEE 754 を使用して 0.5 を表します。BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()Javaが内部的に行うように、0.5のバイトあたりのバイト表現を提供します。

于 2009-04-16T14:56:36.503 に答える