【力扣面试】面试题 05.02. 二进制数转字符串


文章目录

  • 题目
  • 解题思路


题目

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

示例1:

输入:0.625
输出:“0.101”

示例2:

输入:0.1
输出:“ERROR”

提示:

0.1无法被二进制准确表示

解题思路

思路:

题目意思是让求小数的二进制形式,然后将该二进制以String字符串方式输出。

首先要弄清楚,小数十进制形式怎么转换为二进制。

借用百度经验的方法:

1、十进制的小数转换为二进制,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。例如十进制的0.125,要转换为二进制的小数。

ios 二进制字符转 int 二进制流转成字符串_取整

2、转换为二进制,将小数部分0.125乘以2,得0.25,然后取整数部分0

ios 二进制字符转 int 二进制流转成字符串_面试_02

3、再将小数部分0.25乘以2,得0.5,然后取整数部分0

ios 二进制字符转 int 二进制流转成字符串_取整_03

4、再将小数部分0.5乘以2,得1,然后取整数部分1

ios 二进制字符转 int 二进制流转成字符串_十进制_04

5、则得到的二进制的结果就是0.001

ios 二进制字符转 int 二进制流转成字符串_取整_05

小数二进制到十进制的转换。

1、二进制的小数转换为十进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等。例如二进制数0.001转换为十进制。

ios 二进制字符转 int 二进制流转成字符串_取整_06

2、第一位为0,则0*1/2,即0乘以2负 一次方。

ios 二进制字符转 int 二进制流转成字符串_二进制数_07


3、第二位为0,则0*1/4,即0乘以2的负二次方。

ios 二进制字符转 int 二进制流转成字符串_取整_08


4、第三位为1,则1*1/8,即1乘以2的负三次方。

ios 二进制字符转 int 二进制流转成字符串_取整_09

5、各个位上乘完之后,相加,01/2+01/4+1*1/8得十进制的0.125

ios 二进制字符转 int 二进制流转成字符串_面试_10

为什么0.1不能够精确表示二进制数据?

2进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合
例如:
0.5能够表示,因为它可以表示成为1/2
0.75也能够表示,因为它可以表示成为1/2+1/(2^2)
0.875也能够表示,因为它可以表示成为1/2+1/(22)+1/(23)

但是0.1不能够精确表示,因为它补能够表示成为1/(2^n)的和的形式

class Solution0502 {
    public String printBin(double num) {

        StringBuilder ans = new StringBuilder("0.");

        while (num != 0) {
            num *= 2;
            if (num >= 1) {
                ans.append("1") ;
                num -= 1;
            } else {
                ans.append("0");
            }
            if (ans.length() > 32) {//如果不能表示为2进制形式
                return "ERROR";
            }
        }
        return ans.toString();
    }
}

ios 二进制字符转 int 二进制流转成字符串_面试_11

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bianry-number-to-string-lcci