算法很美

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

2019-12-14  本文已影响0人  FiveZM
/**
 * 给定一个介于0和1之间的实数,如0.625,类型为double,
 * 打印它的二进制表示0.101
 * 因为小数点后的二进制分别表示0.5,0.25,0.125
 * <p>
 * 如果该数字无法精确地用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());
    }
}
上一篇下一篇

猜你喜欢

热点阅读