idd*_*ber 1 java binary decimal
我需要将基数10中的0.5转换为基数2(0.1).我试过用
Double.doubleToRawLongBits(0.5)
Run Code Online (Sandbox Code Playgroud)
并且它返回4602678819172646912我猜是十六进制,但它对我没有意义.
编号4602678819172646912是十六进制,十六进制是0x3fe0000000000000.要拆除:
3 | F | E | 0 ...
0 0 1 1 1 1 1 1 1 1 1 0 0 ...
s| exponent | mantissa
Run Code Online (Sandbox Code Playgroud)
s是符号位,指数是指数偏移2 ^ 9(因此该指数意味着-1),尾数是数字1.xxx的xxx部分(1.暗示).因此,这个数字是1.000 ...*2 ^ -1,即0.5.
请注意,这仅描述了"正常"数字,因此没有零,非正规,NaN或无穷大
将数字乘以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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7160 次 |
| 最近记录: |