public class 二进制小数 {
public static void main(String[] args){
double num = 0.625; //1.250
StringBuilder sb = new StringBuilder("0.");
while(num>0){
//乘2
double r = num*2;
//判断整数部分
if(r>=1){
sb.append("1");
//消掉整数部分
num=r-1;
}else{
sb.append("0");
num=r;
}
if (sb.length()>34){
System.out.println("ERROR");
return;
}
}
System.out.println(sb.toString());
}
}
其实思路:就是将一个介于0~1之间的实数,(如6.25),类型为double,打印它的二进制数
具体思路:
- 将num=0.625放进StringBuilder中。
- 判断num是否大于0
- 大于,就将num*2得:1.25
- 再进行判断,如果num大于1则截取整数部分的1放入"盒子",让num-1赋值给num。否则将截取整数的0放入"盒子"。
0.625=(0.101)B
0.625*2=1.25======取出整数部分1
0.25*2=0.5========取出整数部分0
0.5*2=1==========取出整数部分1
5、判断精度,超过34位还没算出则打印ERROR
知识点:
- StringBuilder的用法
- 十进制小数转换为二进制小数
(1) StringBuilder用法:
在Java中String对象是不可改变的。那么每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能。
StringBuilder sb = new StringBuilder("0."); //也可以构造方法,先放入
1、设置容量和长度
虽然说StringBuilder是动态对象,但是你也可以给StringBuilder设置其可容纳长度。例:
StringBuilderMyStringBuilder = new StringBuilder("Hello World!", 25);
在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。
2、常用方法
1、append 添加
StringBuilder sb = new StringBuilder("Hello World!");
sb.append(" What a beautiful day.");
System.out.println(sb);
//打印出 Hello World! What a beautiful day.
2、AppendFormat
int MyInt= 25;
StringBuilder sb = new StringBuilder("Your total is ");
sb.AppendFormat("{0:C} ", MyInt);
System.out.println(sb);
//打印出Your total is $25.00。
3、Insert 插入
StringBuilder sb = new StringBuilder("Hello World!");
sb.Insert(6,"Beautiful ");
System.out.println(sb);
//打印出Hello BeautifulWorld!
4、delete 删除
StringBuilder sb = new StringBuilder("helloooo");
sb.delete(5,7);
System.out.println(sb);
//打印出 helloo
5、Replace 代替
StringBuilder sb = new StringBuilder("Hello World!");
sb.Replace('!', '?');
System.out.println(sb);
如果程序对附加字符串的需求很频繁,不建议使用+来进行字符串的串联。可以考虑使用java.lang.StringBuilder 类
public static void main(String[] args)
{
String text = "" ;
long beginTime = System.currentTimeMillis();
for ( int i= 0 ;i< 10000 ;i++)
text = text + i;
long endTime = System.currentTimeMillis();
System.out.println("执行时间:" +(endTime-beginTime));
//522秒
StringBuilder sb = new StringBuilder ( "" );
beginTime = System.currentTimeMillis();
for ( int i= 0 ;i< 10000 ;i++)
sb.append(String.valueOf(i));
endTime = System.currentTimeMillis();
System.out.println("执行时间:" +(endTime-beginTime));
//2秒
}
参考出处https://www.cnblogs.com/onetheway2018/p/11553168.html
(2)十进制小数转换为二进制小数
可以参考https://www.runoob.com/w3cnote/decimal-decimals-are-converted-to-binary-fractions.html 菜鸟。
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
例如把(0.8125)转换为二进制小数。
0.625*2=1.25======取出整数部分1
0.25*2=0.5========取出整数部分0
0.5*2=1==========取出整数部分1
所以我们上面使用的0.625得出的就是0.101