本人电子系,只为一学生。心喜计算机,小编以怡情。
给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回 “ERROR”。
样例:
n = “3.72”, 返回 “ERROR”.
n = “3.5”, 返回 “11.1”.
总结与反思:
1、要熟练掌握Double、Integer的字符串与数字转换的内置方法
2、double有精度损失,要上网查资料。
public String binaryRepresentation(String n) {
// write your code here
///////////////////////////////////////
//得到整数部分
String temp="";
for(int i=0;n.charAt(i)!='.';i++)
{
temp+=n.charAt(i);
}
////////////////////////////////////////
//这里将十进制数字符串类型的整数变成二进制数字符串型
temp=Integer.toBinaryString(Integer.parseInt(temp));
//数据检验会提供"1.0",要求返回值为"1",而不是"1.0",下边这一步就是做这个工作
if( Double.parseDouble(n) == (int )Double.parseDouble(n) )
return temp;
//////////////////////////////////////////
//取小数部分,我是用StringBuffer将整数部分置零法
StringBuffer linshi=new StringBuffer(n);
for(int i=0;n.charAt(i)!='.';i++)
linshi.setCharAt(i, '0');
double a=Double.valueOf(linshi.toString());//然后利用方法直接转换
//为什么不用原数减整数得到小数呢?是因为double精度损失
// 比如0.93000000.....00001显然不对
//当然如果有其他的方法更好,我只是提供参考方法
//////////////////////////////////
//小数部分转二进制
//循环32次,如果触发等于条件返回二进制数
//没有就返回ERROR
int count=-1;
StringBuffer ret=new StringBuffer();
for(int i=0;i<32;i++)
{
if(a-Math.pow(2, count)>=0)
{
ret.append("1");
a=a-Math.pow(2, count);
}
else {
ret.append("0");
}
if(a==0)//触发条件,例如0.5-0.5==0那么小数部分就得到了
//返回“整数”+“.”+“小数”
return temp+"."+ret.toString();
count--;
}
///////////////////////////////////////
return "ERROR";
}