2009-04-16 219 views
1

我需要將基數10中的0.5轉換爲基數2(0.1)。 我一直在使用如何將Java中的小數轉換爲二進制?

Double.doubleToRawLongBits(0.5) 

嘗試,並返回4602678819172646912我的猜測是十六進制,但它並沒有道理給我。

+0

它是十進制數,而不是十六進制數。 – recursive 2009-04-16 14:49:37

回答

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

這是0x3FE0_0000_0000_0000的十進制數。尾數是3FE(編碼符號和指數)後的零的列表。這是你正在尋找的,因爲0.1之前的零是隱含的。

+0

好吧,我如何將0x3FE0_0000_0000_0000轉換爲字符串「0.1」? – iddober 2009-04-16 14:49:45

+0

這是IEEE 754標準。看看:http://en.wikipedia.org/wiki/IEEE_754-1985 – mouviciel 2009-04-16 14:59:32

6

編號4602678819172646912是dec,十六進制是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 2009-04-16 18:52:01

-2

0.1不是0.5

爪哇的二進制表示將代表使用IEEE 754 0.5,作爲指定在Java Language SpecificationBigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()將爲您提供每個字節0.5的字節,如Java在內部所做的那樣。

+1

「0.1不是二進制表示0.5「 - 好吧,但它不是IEEE 754的代表。這些不是一回事。 – 2009-04-16 15:03:07

0

你想十進制字符串轉換爲浮點二進制或二進制字符串?如果前者,只需使用valueOf();如果是後者,則使用valueOf()後跟toString()或printf()。

相關問題