如何在Java中将小数部分转换为二进制?
我需要将基数10中的0.5转换为基数2(0.1)。 我试过用
Double.doubleToRawLongBits(0.5)
它返回4602678819172646912
,我猜是hex,但它对我没有意义。
将数字乘以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(); }
编号4602678819172646912是十进制,hex是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或无穷大
这是0x3FE0_0000_0000_0000
十进制数。 尾数是3FE之后的零列表(对符号和指数进行编码)。 这是你正在寻找的,假设在隐含0之前为0.1。
是否要将十进制字符串转换为浮点二进制或二进制字符串? 如果是前者,只需使用valueOf(); 如果是后者,请使用valueOf()后跟toString()或printf()。
0.1不是0.5的二进制表示
根据Java语言规范的规定,Java将使用IEEE 754表示0.5。 BigInteger.valueOf(Double.doubleToRawLongBits(0.5)).toByteArray()
将在内部为Java提供每字节表示0.5的字节。
- 将现有php类转换为Java的最佳方法是什么?
- 用户会话在tomcat上混淆了
- SWIG(v1.3.29)生成的C ++到Java Vector类不能正常运行
- 如何从Scala代码动态填充java.util.HashMap?
- 复制粘贴快捷方式仅在OSX Java应用程序中使用ctrl键
- 使用ArrayDescriptor在java中创建Oracle ARRAY Type时出现问题
- 检查BigInteger是不是一个完美的正方形
- 身份validation流程中grant_type = client_credentials和grant_type =密码之间的区别?
- Scala / Play:将JSON解析为Map而不是JsObject