2009-04-16 11 views

答えて

5

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(); 
} 
+0

私はなぜここでn = 10を取ったのですか? – Constantine

+0

小数点以下の桁数である "quick&DIRTY" - 任意に選択された...(メソッドの引数かもしれません) –

+0

再帰を使用してください。 @CarlosHeuberger –

1

これは0x3FE0_0000_0000_0000の小数です。仮数は、3FE(符号と指数を符号化する)の後の0のリストです。ゼロの前に0.1が暗黙的に指定されているので、これはあなたが探しているものです。

+0

0x3FE0_0000_0000_0000を文字列 "0.1"に変換するにはどうすればよいですか? – iddober

+0

これはIEEE 754標準です。見てください:http://en.wikipedia.org/wiki/IEEE_754-1985 – mouviciel

6

番号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または無限大

+0

ベース10で0.5をとり、 "0.1"(基数2)を与えるコードを教えてください。 – iddober

-2

0.1が指定されているJavaはIEEE 754を使用して0.5を表します0.5

のバイナリ表現でないと

Java Language Specificationにあります。 BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()は、Javaが内部的に行うように、1バイトあたりのバイト数を0.5にします。

+1

"0.1は以下の2進表現ではありません0.5 " - そうですが、IEEE 754の表現ではありません。それらは同じものではありません。 –

0

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

関連する問題