给定一个介于0和1之间的实数,(如0.625),类型位double,打印它的二进制表示(0.101,因为小数点后的二进制分别表示0.5,0.25,0.125…)。如果该数字无法精确地用32位以内地二进制表示,则打印“ERROR”。
分析:
二进制小数点旁边的1左移一位代表乘以2,右移一位代表除以2
十进制整数转化为k进制用除法,小数(浮点数)转化为k进制则用乘法
**乘的或者除的数为k **
小数点左边第一位是几就添加几,比如上面0.625乘以2得到1.25,则得到0.1
然后抹掉小数点左边第一位,即将它设置为0
所以1.25转化为0.25
java代码实现如下:
public class test1 {
public static void main(String[] args) {
double num=0.625;
//通过StringBuilder类创建一个对象,预设值为“0.”,类型为字符串类型
StringBuilder sb = new StringBuilder("0.");
//判断这个数如果不为0则表示还能继续乘以2
while(num>0) {
double r=num*2;
//判断小数点左边第一位是否为1
if (r>=1) {
//如果小数点左边第一位为1,则sb后面添加1,并且抹掉那个1
sb.append("1");
num=r-1;
}
else {
//如果小数点左边第一位为0,则sb后面添加0
sb.append("0");
num=r;
}
if(sb.length()>34) {//如果该数字不能用32位以内的二进制表示则打印“ERROR”
System.out.print("ERROR");
return;
}
}
System.out.println(sb.toString());
}
}
StringBuilder的简单介绍
在java中,除了可以使用String类来存储字符串,还可以使用StringBuilder类或StringBuffer类存储字符串,String类创建一个对象并赋值后,该对象的值是不可以改变的,必须重新创建一个对象,即所指向的内存空间不同了:
s=“IM”; s=s+“hello!”
字符串s 被修改,创建了一个新的名为s的对象,指向了不同的内存空间,这样对象就增加了,占用的内存增多,降低运算的效率,那么可以使用StringBuilder类或StringBuffer类来避免这种问题。至于StringBuilder类或StringBuffer类的不同之处在于,StringBuilder没有实现线程安全,所以性能略高,因此一般情况下,如果需要创建一个内容可变的字符串对象,应该优先考虑使用StringBuilder类。
更详细的内容可以参考这篇文章:https://www.cnblogs.com/chengshan/p/12272443.html