2009-04-16 214 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()。

相关问题