package exam1;
/*
* 十进制转二进制。
* 对double数据进行取精度.
* @param value double数据.
* @param scale 精度位数(保留的小数位数).
* @param roundingMode 精度取值方式.
* @return 精度计算后的数据.
*/
import java.math.BigDecimal;//大数字精确计算
class Demo_skill1
{
private double num;
public void ToBin(double num)
{
StringBuffer str = new StringBuffer();
if(num > 0)//这里考虑小数
{
int Inf = (int)num;//提取整数部分
BigDecimal ss = new BigDecimal(num);//声明并创建一个大数字类型对象ss
BigDecimal tt = new BigDecimal(Inf);//声明并创建一个大数字类型对象tt
ss = ss.subtract(tt);//提取小数部分
if(Inf==0) str.append('0');
while(Inf > 0)//整数部分转化为二进制
{
str.append(Inf%2);
Inf/=2;
}
str.reverse();
ss = ss.setScale(10,BigDecimal.ROUND_HALF_UP);//取10位精度
double xx = ss.doubleValue();//转换为double类型
if(xx > 0)//小数部分转化为二进制
{
str.append('.');
double flag = 0.0001;
int kk = 10;//考虑无限循环的问题
while(flag!=0&&kk!=0)
{
xx = xx*2;
int rr = (int)xx;
str.append(rr);
BigDecimal yy = new BigDecimal(xx);
BigDecimal zz = new BigDecimal(rr);
yy = yy.subtract(zz);
yy = yy.setScale(10,BigDecimal.ROUND_HALF_UP);//取10位精度
flag = yy.doubleValue();
xx = yy.doubleValue();
kk--;
}
}
System.out.println(str);
}
}
}
public class skill1 {
public static void main(String[] args) {
Demo_skill1 test = new Demo_skill1();
test.ToBin(1.011125);
}
}
|