我需要将基数10中的0.5转换为基数2(0.1)。 我尝试过使用
Double.doubleToRawLongBits(0.5)
并返回4602678819172646912
,我猜这是十六进制,但对我来说没有意义。
答案 0 :(得分:6)
没有。 4602678819172646912是十进制,十六进制是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或无穷大
答案 1 :(得分: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();
}
答案 2 :(得分:1)
这是0x3FE0_0000_0000_0000
的小数。尾数是3FE之后的零列表(对符号和指数进行编码)。这是你正在寻找的,假设在隐含零之前为0.1。
答案 3 :(得分:0)
是否要将十进制字符串转换为浮点二进制或二进制字符串?如果是前者,只需使用valueOf();如果是后者,请使用valueOf()后跟toString()或printf()。
答案 4 :(得分:-2)
0.1不是0.5
的二进制表示 Java将使用IEEE 754代表0.5,如Java Language Specification所述。 BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()
将为您提供每字节表示0.5的字节,就像Java在内部表示的那样。