我需要将基数 10 中的 0.5 转换为基数 2 (0.1)。我试过使用
Double.doubleToRawLongBits(0.5)
它返回4602678819172646912
我猜是十六进制的,但对我来说没有意义。
编号 4602678819172646912 为 dec,十六进制为 0x3fe0000000000000。要拆除它:
3 | F | E | 0 ...
0 0 1 1 1 1 1 1 1 1 1 0 0 ...
s| exponent | mantissa
s 是符号位,exponent 是移动了 2^9 的指数(因此这个指数意味着 -1),尾数是数字 1.xxx 的 xxx 部分(隐含 1.)。因此,这个数字是 1.000...*2^-1,也就是 0.5。
请注意,这仅描述“正常”数字,因此没有零、非规范、NaN 或无穷大
将您的数字乘以 2^n,转换为 BigInteger,转换为二进制字符串,在位置 n(从右到左)添加一个小数点。
示例(快速和 ++dirty):
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();
}
这是十进制的0x3FE0_0000_0000_0000
。尾数是 3FE 之后的零列表(编码符号和指数)。这就是您要查找的内容,因为零之前的 0.1 是隐含的。
要将十进制字符串转换为浮点二进制还是二进制字符串?如果是前者,只需使用 valueOf(); 如果是后者,使用 valueOf() 后跟 toString() 或 printf()。
0.1 不是 0.5 的二进制表示
Java 将使用 IEEE 754 表示 0.5,如Java Language Specification中所指定。BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()
正如 Java 在内部所做的那样,将为您提供 0.5 的每字节表示。