零至壹之间浮点实数的二进制表示

/**
 * 给定一个介于0和1之间的实数,如0.625,类型为double,
 * 打印它的二进制表示0.101
 * 因为小数点后的二进制分别表示0.5,0.25,0.125
 * 

* 如果该数字无法精确地用32位以内的二进制表示,则打印"error" * 注意 "0.****' 字符串中的"0."不算在32位内 * * 知识点一: * 整数转为二进制是除2取余 * 例如 15 ,15/2 = 7 ---1; * 7/2 = 3 ---1 * 3/2 = 1 ---1 * 1/2 = 0 ---1 * 结果是 1111 * * 那么小数转为二进制是乘2移整 * 例如0.625 * 0.625 * 2 = 1.25 >= 1 ,移除 1,取1,即1.25-1=0.25 * 0.25 * 2 =0.5 不大于等于1, 取0, * 0.5 * 2 =1.0 >= 1,移除1,取1,即1.0-1.0 = 0 * 结果为0.拼接上101 等于0.101 * * 0.101 转为 实数为,从小数点往右移动,第一位是1,那么1 * (1/(2^1))=0.5 * 第二位是0,即0*(1/(2^2)) = 0 * 第三位是1,即1*(1/(2^3)) = 0.125 * 0.5 + 0+ 0.125 = 0.625 * * */

public class 零至壹之间浮点实数的二进制表示 {

    public static void main(String[] args) {
        double num = 0.625;
        StringBuilder sb = new StringBuilder("0.");
        while (num != 0) {
            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());
    }
}

你可能感兴趣的:(零至壹之间浮点实数的二进制表示)