黑马程序员技术交流社区

标题: 怎么把这里的精度精确? [打印本页]

作者: yefeidd    时间: 2015-7-31 11:00
标题: 怎么把这里的精度精确?
  1. package exam1;

  2. /*
  3. * 十进制转二进制。
  4. */


  5. import java.math.*;

  6. class Demo_skill1
  7. {
  8.         private double num;
  9.         public void ToBin(double num)
  10.         {
  11.                 StringBuffer str = new StringBuffer();
  12.                 if(num > 0)//这里考虑小数
  13.                 {
  14.                         double ss = Math.floor(num);
  15.                         int Inf = (int)ss;//提取整数部分
  16.                         double tt = num-ss;//提取小数部分
  17.                         while(Inf > 0)//整数部分转化为二进制
  18.                         {
  19.                         str.append(Inf%2);
  20.                         Inf/=2;
  21.                         }
  22.                         str.reverse();
  23.                        
  24.                         if(tt > 0)//小数部分转化为二进制
  25.                         {
  26.                                 str.append('.');
  27.                                 double flag = 0.0001;
  28.                                 while(flag!=0)
  29.                                 {
  30.                                         tt = tt*2;
  31.                                         ss = Math.floor(tt);
  32.                                         int rr = (int)ss;
  33.                                         str.append(rr);
  34.                                         flag = tt - rr;
  35.                                         tt =tt - rr;
  36.                                 }
  37.                         }
  38.                        
  39.                         System.out.println(str);
  40.                 }
  41.         }
  42. }

  43. public class skill1 {

  44.         public static void main(String[] args) {
  45.                
  46.                 Demo_skill1 test = new Demo_skill1();
  47.                 test.ToBin(15.1);
  48.         }

  49. }
复制代码



这里提取小数部分的时候,精度出现了问题。
作者: yefeidd    时间: 2015-7-31 11:12
java.math.BigDecimal  找到了
作者: yefeidd    时间: 2015-7-31 17:14
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);
        }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2