二进制表示浮点实数《算法很美》

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,打印它的二进制数
具体思路:

  1. 将num=0.625放进StringBuilder中。
  2. 判断num是否大于0
  3. 大于,就将num*2得:1.25
  4. 再进行判断,如果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

知识点:

  1. StringBuilder的用法
  2. 十进制小数转换为二进制小数

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值