原文:
Given a (decimal - e.g. 3.72) number that is passed in as a string, print the binary representation.If the number can not be represented accurately in binary, print “ERROR”.
译文:
给定一个字符串类型(string)表示的小数,打印出它的二进制表示。 如果这个数无法精确地表示为二进制形式,输出"ERROR"。
整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示。 小数部分则通过不断地乘以2然后与1比较来得到其二进制表示。 小数部分转化为二进制,通过乘以2然后与1比较,大于等于1则该位为1,并且该值减去1; 否则该位为0。不断地通过这种操作最终能使该小数部分的值变为0的,即可精确表示。
否则将无法用有限的位数来表示这个小数部分。我们可以设定一个长度,比如说32, 在32位之内还无法精确地表示这个小数部分的,我们就认为它无法精确表示了。
package chapter_5_BitManipulation;
import java.util.Scanner;
/**
*
* 给定一个字符串类型(string)表示的小数,打印出它的二进制表示。 如果这个数无法精确地表示为二进制形式,输出"ERROR"。
*
*/
public class Question_5_2 {
// 计算小数的二进制表示
public static String change(String strs[]) {
int len = 0;
int intpart = Integer.parseInt(strs[0]);
double decpart = Double.parseDouble("0." + strs[1]);
String intString = "";
StringBuilder decString = new StringBuilder();
while(intpart > 0) {
// intString.append(intpart % 2);
intString = intpart % 2 + intString;
intpart /= 2;
}
while(decpart != 0) {
decpart *= 2;
if(decpart >= 1) {
decString.append(1);
decpart -= 1;
} else {
decString.append(0);
}
len ++;
if(len == 30) {
return "ERROR";
}
}
// 如果是0.0的情形
if(intString.length() == 0) {
intString = "0";
}
if(decString.length() == 0) {
decString = decString.append("0");
}
return intString + "." + decString.toString();
}
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
boolean isPositive = true;
// 如果小数是负数,则截取第一位之后的数据
if(string.charAt(0) == '-') {
isPositive = false;
string = string.substring(1);
}
// 以小数点作为截取点分开
String strs[] = string.split("\\.");
String result = change(strs);
if(isPositive) {
System.out.println("二进制:" + result);
} else {
System.out.println("二进制:-" + result);
}
}
}
参考自:http://www.hawstein.com/posts/5.2.html