Topic 5.2 Given a real number between 0 and 1(e.g.,0.72) that is passed in as a double, print the binary representation. If the number cannot be represented accurately in binary with at most 32 characters, print “ERROR”.
很神奇。这个题的要求是把0.375打印成 0.011.
系统里面处理本来就是二进制的,输出是十进制,现在是把系统的二进制用字符串的形式显示出来。
方法: r=210*0.1012=1*20+ 0*2-1 +1*2-2=1.012.
If r>=1, 那么第一位就是1,在arrayBuilder里append 1. 然后用-1把这一位去掉. By doing this continuously, we can check every digit.
public class c5_2 {
public static String printBinary(double num) {
if (num >= 1 || num <= 0) {
return "ERROR";
}
StringBuilder binary = new StringBuilder();
binary.append(".");
while (num > 0) {
/* Setting a limit on length: 32 characters */
if (binary.length() > 32) {
return "ERROR";
}
double r = num * 2;
if (r >= 1) {
binary.append(1);
num = r - 1;
} else {
binary.append(0);
num = r;
}
}
return binary.toString();
}
public static void main(String[] args) {
String bs = printBinary(.125);
System.out.println(bs);
for (int i = 0; i < 1000; i++) {
double num = i / 1000.0;
String binary = printBinary(num);
if (!binary.equals("ERROR")) {
System.out.println(num + " : " + binary );
}
}
}
}
//结果
.001
0.125 : .001
0.25 : .01
0.375 : .011
0.5 : .1
0.625 : .101
0.75 : .11
0.875 : .111