首页 > 试题广场 >

二进制小数

[编程题]二进制小数
  • 热度指数:10726 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个double num,范围是0到1的实数,若其能用32位以内的二进制表示出来则返回值string为其二进制值,若不能则返回值为“Error”。

测试样例:
0.625
返回:0.101
思路

例如:num = 0.625
因为小数点后第一位表示的是0.5,第二位是0.25,第三位是0.125。。。。。。
如果num 大于等于 base = 0.5 则第一位则为1,num 减去0.5 否则为0。无论是不是为1,base都的除以2,以来判断第二位是不是为1,以此类推。。。。

代码
class BinDecimal {
public:
    string printBin(double num) {
        string str("0.");
        double base = 0.5;
        while(num > 0){
            if(num >= base){
                num -= base;
                str += "1";
            }//if
            else{
                str += "0";
            }//else
            base /= 2;
            if(str.size() > 32){
                str = "Error";
                break;
            }//if
        }//while
        return str;
    }
};

发表于 2015-08-19 22:42:03 回复(5)
public String printBin(double num) {
       StringBuffer sb=new StringBuffer("0.");
       int count=32;
       while(num!=0.0){
           count--;
           if(count<0) return "Error";
           num=num*2;
           if(num>=1) {
               sb.append("1");
               num-=1;
           }else sb.append("0");
           
       }
       return sb.toString();
    }

发表于 2017-05-13 19:29:26 回复(0)

十进制浮点数转成二进制

整数部分:除以2,取出余数,商继续除以2,直到得到0为止,将取出的余数逆序

小数部分:乘以2,然后取出整数部分,将剩下的小数部分继续乘以2,然后再取整数部分,一直取到小数部分为零为止。如果永远不为零,则按要求保留足够位数的小数,最后一位做0舍1入。将取出的整数顺序排列。

举例:22.8125 转二进制的计算过程:

整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。
22 / 2  11 余0
11/2     5  余 1
5  /2      2  余 1
2  /2      1  余 0
1  /2      0  余 1
得到22的二进制是10110


小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,

得到0.8125的二进制是0.1101

结果:十进制22.8125等于二进制00010110.1101


class BinDecimal {
public:
    string printBin(double num) {
        stringstream res;
        res << "0.";
        for (int i=0; i<32; ++i) {
            if (num == 0.0) break;
            num *= 2;
            res << (int)num;
            num -= (int)num;
        }
        if (num == 0.0) {
            return res.str();
        } else {
            return "Error";
        }
    }
};


运行时间:4ms

占用内存:472k


发表于 2018-12-26 15:41:05 回复(0)
import java.util.*;

public class BinDecimal {
    public String printBin(double num) {
        // write code here
        if(num>=1 || num<0)
            return "Error";
        StringBuilder str=new StringBuilder();
        str.append("0.");
        while(num>0){
            if(str.length()>32)
                return "Error";
            num=num*2;
            if(num>=1){
                str.append("1");
                num-=1;
            }else{
                str.append(0);
            }
        }
        return str.toString();
    }
}

发表于 2018-05-16 11:03:16 回复(0)
利用十进制小数转换为二进制的特点:小数*2,如果实数大于1,说明小数点后一位是1,如果小于1,说明小数点后一位是0;
//the Java version
import java.util.*;
public class BinDecimal {
    public String printBin(double num) {
        StringBuffer sb = new StringBuffer("0.");
        while(num != 0.0){
            if(sb.length() > 32) return "Error";
            num *= 2;
            if(num >= 1){
                sb.append("1");
                num -= 1;
            }else{
                sb.append("0");
            }
        }
        return sb.toString();
    }
}

发表于 2017-05-16 21:25:52 回复(0)
public String printBin(double num){
		StringBuilder sb = new StringBuilder();
		sb.append("0.");
		int time = 30;
		double tmp = num;
		while(tmp > 0 && time-- > 0){
			tmp *= 2;
			sb.append((int)tmp);
			tmp = tmp >=1 ? (tmp - 1) : tmp;
		}
		if(tmp > 0)
			return "Error";
		else
			return sb.toString();
	}

发表于 2015-11-09 13:43:21 回复(0)
class BinDecimal
{
    public string printBin(double num)
    {
        string res = "0.";
        int i=1;
        while(i<=32)
        {
            if((num%1)*2==1){
                res = res+"1";
                return res;
            }
            if((num%1)*2>1){
            res = res+"1";
            }
            res = res +"0";
            num = 2*num;
            i++;            
        }
        return "Error";

    }
}
发表于 2020-08-07 15:50:42 回复(0)
class BinDecimal {
public:
    string printBin(double num) {
        string ans="0.";
        double range=0.5;
        while(num>0)
        {
            if(num>=range)
            {
                num=num-range;
                range/=2;
                ans+='1';
            }
            else{
                range/=2;
                ans+='0';
            }
            if(ans.size()>32) break;
        }
        if(num!=0) return "Error";
        else return ans;
    }
};

发表于 2019-05-04 21:05:54 回复(0)
import java.util.*;

public class BinDecimal {
    public String printBin(double num) {
        StringBuffer sr=new StringBuffer();
		sr.append(0);
		sr.append(".");
		while(num!=0){
			num=(num*2);
			int b=(int)num;
			sr.append(b);
			num=num-b;
		}
        if(sr.length()>32)
            return "Error";
        else
		    return sr.toString();
    }
}

发表于 2017-06-02 10:02:48 回复(0)

十进制转二进制方法

小数和整数部分拆开分别计算。 整数部分:

StringBuilder sb = new StringBuilder();
while( num>0 ){
    int r = num%2;
    num /= 2;
    sb.append(r);
}

小数部分:

while( num>0 ){
    int r = num*2;
    if ( r>=1 ) {
        sb.append(1);
        num = r-1;
    }
    else {
        sb.append(0);
        num = r;
    }
}
发表于 2017-03-31 16:18:09 回复(0)
//小数点后第一位是1/2 //之后每后一一位就除以二 //小数点后从前向后开始,每一位上如果大于该位数为“1”所表示的数,
//则该位为“1”,并将数据减少该位为“1”时代表的那个数
//一直这样做,直到减为0,或者超过32位为止

//注意 float ,double类型不能用 ==来判断
class BinDecimal {
public:
    string printBin(double num) {
        string res = "0.";
        double alf = 2;
        int count = 1;
        while(num > 0 && count <= 32){
            if(num - 1/alf > 0){
                res.push_back('1');
                num = num - 1/alf;
                alf = alf*2;
                count++;
            }
            else if(num - 1/alf < 0){
                res.push_back('0');
                alf = alf*2;
                count++;
            }
            else {
                res.push_back('1');
                break;
            }
        }
        if(count > 32 ) return "Error";
        return res;
    }
};

编辑于 2016-08-13 16:17:40 回复(0)
思路:
小数左移一位,如果实数大于1,说明小数点后一位是1,如果小于1,说明小数点后一位是0
重复这个过程,即可得到实数的二进制表示
# -*- coding:utf-8 -*-
class BinDecimal:
    def printBin(self, num):
        if num >= 1 or num <= 0:
            return "Error"
        
        binary = ['0', '.']
        
        while num > 0:
            if len(binary) >= 32:
                return "Error"
            
            r = num * 2
            if r >= 1:
                binary.append('1')
                num = r - 1
            else:
                binary.append('0')
                num = r
        return ''.join(binary)

发表于 2016-08-03 20:01:53 回复(0)
    public String printBin(double num) {
		if (num < 0 || num > 1) 
			return "Error";
		
		StringBuilder sb = new StringBuilder().append("0.");
		for (int i = 2; i < 32; i++) {
			num *= 2;
			if (num > 1) {
				num -= 1;
				sb.append('1');
			} else if (num < 1) {
				sb.append('0');
			} else {
				sb.append('1');
				return sb.toString();
			}
		}

		return "Error";
	}

发表于 2016-04-08 22:16:35 回复(0)
Ron头像 Ron
 /*0-1之间小数的二进制表示是通过乘法得到,每次乘以2,注意判断是否可用32位完整表示*/
     public String printBin(double num) {
        // write code here
		String res = doubleToBinary(num);
		if(res.length()>32){
			return "Error";
		}else{
			return "0."+res;
		}
    }
    
    private static String doubleToBinary(double num) {
		// TODO Auto-generated method stub
    	String res = "";
    	if(num == 0.0){
    		return 0+"";
    	}
    	if(num*2 > 1){
    		res = "1" + doubleToBinary(num*2-1);
    	}else if(num*2 == 1.0){
    		return "1";
    	}else{// num*2 <1
    		res = "0" + doubleToBinary(num*2);
    	}
    	return res;
	}

编辑于 2015-10-08 15:55:53 回复(0)
import java.util.*;

public class BinDecimal {
   public String printBin(double num) {
        StringBuffer sb = new StringBuffer("0.");
        int count = 0;
        while( num > Math.pow(10, -7)){
            int a = (int)(num * 2);
            num = 2*num - a;
            sb.append(a);
            count++;
            if(count > 23)//32位浮点数表示小数位只有23位,因为是0到1之间的数,只能是占据小数位
                return "Error";
        }
        return sb.toString();
    }
}

发表于 2015-08-19 16:57:33 回复(0)
public String printBin(double num) {
        // write code here
        StringBuffer res = new StringBuffer();
        res.append("0.");
        while(num != 0){
            num = num * 2;
            res.append((int)num);
            num = num - (int)num;
        }
        if(res.length() > 32) return "Error";
        return res.toString();
    }

发表于 2020-09-02 15:27:23 回复(0)
class BinDecimal {
public:
    string printBin(double num) {
        string res="0.";
        double sum=0.0;
        for(int i=1;i<=30;++i)
        {
            if(sum+pow(2,-i)==num)
            {
                res+='1';
                return res;
            }
            else if(sum+pow(2,-i)<num)
            {
                sum+=pow(2,-i);
                res+='1';
            }
                
            else
                res+='0';
        }
        return "Error";
    }
};

发表于 2020-07-05 16:29:58 回复(0)
public static String printBin(double num) {
        // write code here
		int i = 2;
		char[] c = new char[34];		//字符串最长为 34个字符
		c[0] = '0';			
		c[1] = '.';			//确定开始字符
		while(i <= 33) {
			num *= 2;		//累乘
			if(num > 1) {				//若结果大于1
				num -= 1;				//保留小数部分
				c[i++] = '1';				//存取整数部分
			}else if(num == 1) {		//若结果大于0
				c[i++] = '1';		//存取结果
				break;			//退出循环
			}
			else c[i++] = '0';		//保留整数部位
		}
		//若 num 为 1 ,成立,返回字符数组第 0 个字符至 第 i 个字符组成的字符串
		if(num == 1) return new String(c,0,i);	
		else return new String("Error");
    }

发表于 2019-10-24 22:00:55 回复(0)
class BinDecimal {
public:
    string printBin(double num) {
        string ans;
        int cnt = 0;
        while (num != 0 && cnt <= 32)
        {
            ++cnt;
            int i = static_cast<int>(num*2);
            ans.push_back(i+'0');
            num = num*2 - i;
        }
        if (cnt >= 32) return "Error";
        return "0."+ans;
    }
};

发表于 2019-09-08 18:21:39 回复(0)
class BinDecimal {
public:
    string printBin(double num) {
        // write code here
        if(num >= 1 || num < 0){
            return "Error";
        }
        string str = "0.";
        while(num > 0){
            if(str.size() > 32){
                return "Error";
            }
            num = num * 2;
            if(num >= 1){
                str += "1";
                num -= 1;
            } else {
                str += "0";
            }
        }
        return str;
    }
};

发表于 2019-08-09 17:24:02 回复(0)