零至壹之间浮点实数的二进制表示
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());
}
}