Cracking the coding interview--Q5.2

原文:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值