二进制数转字符串

227 阅读2分钟

1. 题目与解析

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

输入:0.625

输出:"0.101"

输入:0.1

输出:"ERROR"

提示:0.1无法被二进制准确表示

提示:

  • 32位包括输出中的 "0." 这两位。
  • 题目保证输入用例的小数位数最多只有 6 位 介于 000 和 111 之间的实数的整数部分是 000,小数部分大于 000,因此其二进制表示的整数部分是 000,需要将小数部分转换成二进制表示。

我们使用二进制表示小数时,第i位数字表示(1/2)^i1还是0,举一个例子,0.101就表示1*(1/2)^1 + 0*(1/2)^2 + 1*(1/2)^3。知道了这一点,如果我们给某个小数乘以2,如果其整数部分增加了1,就说明(1/2)^i位置上是1,反之则是0

十进制小数转二进制小数的方法是:小数部分乘以 2,取整数部分作为二进制小数的下一位,小数部分作为下一次乘法的被乘数,直到小数部分为 0 或者二进制小数的长度超过 32 位。

对于本题,由于实数介于 01 之间,所以其整数部分一定是 0,我们只需要将小数部分,按照上述方法转换为二进制小数即可。当小数部分为 0 或者二进制小数的长度不小于 32 位时,停止转换。

最后,如果小数部分不为 0,说明该实数无法用 32 位以内的二进制表示,返回字符串 "ERROR",否则返回转换后的二进制小数。

2. 题解

class Solution {
    public String printBin(double num) {
        StringBuilder ans = new StringBuilder("0.");
        while (ans.length() < 32 && num != 0) {
            num *= 2;
            int x = (int) num;
            ans.append(x);
            num -= x;
        }
        return num != 0 ? "ERROR" : ans.toString();
    }
}