ベース10をベース0.5(ベース)に変換する必要があります。 私はJavaで小数部分をバイナリに変換するにはどうすればよいですか?
Double.doubleToRawLongBits(0.5)
を使用してみましたが、それは私が六角であるが、それは私には意味がないと思い4602678819172646912
を返します。
ベース10をベース0.5(ベース)に変換する必要があります。 私はJavaで小数部分をバイナリに変換するにはどうすればよいですか?
Double.doubleToRawLongBits(0.5)
を使用してみましたが、それは私が六角であるが、それは私には意味がないと思い4602678819172646912
を返します。
BigIntegerに変換し、バイナリ文字列に変換するには、2^nで番号を掛けます。文字列では、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();
}
私はなぜここでn = 10を取ったのですか? – Constantine
小数点以下の桁数である "quick&DIRTY" - 任意に選択された...(メソッドの引数かもしれません) –
再帰を使用してください。 @CarlosHeuberger –
番号4602678819172646912はdecで、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または無限大
ベース10で0.5をとり、 "0.1"(基数2)を与えるコードを教えてください。 – iddober
0.1が指定されているJavaはIEEE 754を使用して0.5を表します0.5
のバイナリ表現でないと
注Java Language Specificationにあります。 BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()
は、Javaが内部的に行うように、1バイトあたりのバイト数を0.5にします。
"0.1は以下の2進表現ではありません0.5 " - そうですが、IEEE 754の表現ではありません。それらは同じものではありません。 –
バイナリまたはバイナリ文字列に浮動小数点10進文字列を変換したいですか?前者の場合は、単にvalueOf()を使用します。後者の場合は、valueOf()の後にtoString()またはprintf()を続けて使用します。
16進ではなく10進数です。 – recursive