2009-04-16 6 views

Antwort

5

Multiplizieren Sie Ihre Zahl mit 2^n, konvertieren Sie sie in einen BigInteger, konvertieren Sie sie in binär String, fügen Sie einen Dezimalpunkt an Position n hinzu (von rechts nach links).

Beispiel (quick & ++ schmutzig):

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

Warum haben wir hier n = 10 genommen? – Constantine

+0

"quick & DIRTY" das ist die Anzahl der Nachkommastellen - beliebig gewählt ... (könnte ein Methodenargument gewesen sein) –

+0

können Sie das bitte mit Rekursion machen. @CarlosHeuberger –

1

Dies ist dezimal für 0x3FE0_0000_0000_0000. Die Mantisse ist die Liste der Nullen nach 3FE (die Vorzeichen und Exponent codiert). Dies ist, was Sie suchen, da 0,1 vor den Nullen implizit ist.

+0

Ok, wie kann ich 0x3FE0_0000_0000_0000 in den String "0.1" konvertieren? – iddober

+0

Dies ist IEEE 754 Standard. Schau dir an: http://en.wikipedia.org/wiki/IEEE_754-1985 – mouviciel

6

Nr. 4602678819172646912 ist in dez, hex ist 0x3fe0000000000000. Zu demontieren, dass:

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

s das Vorzeichenbit, Exponent ist der Exponent verschoben um 2^9 (daher dieser Exponent bedeutet, -1), die Mantisse ist xxx Teil der Nummer 1.xxx (1 ist angedeutet). Daher ist diese Zahl 1,000 ... * 2^-1, was 0,5 ist.

Beachten Sie, dass dies nur die „normalen“ Zahlen beschreibt, also keine Nullen, denormals, NaNs oder Unendlichkeiten

+0

Kannst du mir bitte Code geben, der 0.5 in Base 10 nimmt und mir "0.1" gibt (Base 2) – iddober

-2

0.1 ist nicht eine binäre Darstellung von 0,5

Java wird 0,5 repräsentieren IEEE mit 754, wie angegeben auf der Java Language Specification. BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray() gibt Ihnen eine Byte pro Byte Darstellung von 0,5 wie Java intern tut.

+1

"0.1 ist KEINE binäre Darstellung von 0,5 "- Nun, das ist es, aber es ist nicht die IEEE 754-Darstellung. Das sind nicht die gleichen Dinge. –

0

Haben Sie die Dezimalstring in Gleitkomma-binär oder in eine binäre Zeichenfolge konvertieren? Wenn ersteres, benutze einfach valueOf(); Wenn Letzteres verwendet wird, verwenden Sie valueOf() gefolgt von toString() oder printf().