基数 10 の 0.5 を基数 2 (0.1) に変換する必要があります。使ってみました
Double.doubleToRawLongBits(0.5)
そして、それは4602678819172646912
16進数であると思いますが、私には意味がありません。
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、または無限大は含まれていないことに注意してください。
数値に 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();
}
これは の 10 進数です0x3FE0_0000_0000_0000
。仮数は、3FE (符号と指数をコード化) の後のゼロのリストです。ゼロの前の 0.1 が暗黙的であることを考えると、これはあなたが探しているものです。
10 進文字列を浮動小数点バイナリまたはバイナリ文字列に変換しますか? 前者の場合は、valueOf(); を使用してください。後者の場合は、valueOf() の後に toString() または printf() を使用します。
0.1 は 0.5 のバイナリ表現ではありません
Java は、 Java 言語仕様で指定されているように、IEEE 754 を使用して 0.5 を表します。BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()
Javaが内部的に行うように、0.5のバイトあたりのバイト表現を提供します。