BigDecimal类

 1 /**
 2  * 一.java的double类型会丢失精度
 3  * 二.BigDecimal不推荐使用double类型的构造参数,因为得到的值只是一个近似值,比如0.1,只会得到一个近似0.1的值
 4  * 三.BigDeciaml推荐使用String类型的构造参数,因为得到的值是精确值
 5  * 四.如果一定要使用double类型的,通过BigDecimal valueOf(double value)静态方法来创建BigDecimal对象
 6  * @author 罗摩衔那
 7  *
 8  */
 9 public class Demo_BigDecimal 
10 {
11 
12     public static void main(String[] args) 
13     {
14        BigDecimal f1=new BigDecimal("0.05");//String参数类型的构造函数
15        BigDecimal f2=BigDecimal.valueOf(0.01);
16        BigDecimal f3=new BigDecimal(0.05);//double参数类型的构造函数
17        
18        System.out.println("使用String作为BigDecimal构造参数 ");
19        System.out.println("0.05+0.01="+f1.add(f2));
20        System.out.println("0.05-0.01="+f1.subtract(f2));
21        System.out.println("0.05*0.01="+f1.multiply(f2));
22        System.out.println("0.05/0.01="+f1.divide(f2));
23        
24        System.out.println("使用double作为BigDecima构造参数 ");
25        System.out.println("0.05+0.01="+f3.add(f2));
26        System.out.println("0.05-0.01="+f3.subtract(f2));
27        System.out.println("0.05*0.01="+f3.multiply(f2));
28        System.out.println("0.05/0.01="+f3.divide(f2));
29     }
30 
31 }

 二.如果程序要对double类型的数值进行运算,可用Arith工具类

    程序实质为:将double类型的数值包装成BigDecimal对象,再调用BigDecimal类的运算方法进行运算,最后转换成double类型变量

 1 import java.math.BigDecimal;
 2 
 3 public class Arith 
 4 {
 5    public static void main(String[] args) 
 6    {
 7     System.out.println("0.05+0.01="+Arith.add(0.05, 0.01));
 8     System.out.println("0.05+0.01="+Arith.sub(0.05, 0.01));
 9     System.out.println("0.05+0.01="+Arith.mul(0.05, 0.01));
10     System.out.println("0.05+0.01="+Arith.div(0.05, 0.01));
11    }
12    //默认除法运算精度
13     private static final int DEY_DIV_SCALE=10;
14     //构造器私有,让这个类不能实例化
15     private Arith() {};
16     
17     //
18     public static double add(double b1,double b2)
19     {
20         BigDecimal v1=BigDecimal.valueOf(b1);
21         BigDecimal v2=BigDecimal.valueOf(b2);
22         return v1.add(v2).doubleValue();
23     }
24     
25     //
26     public static double sub(double b1,double b2)
27     {
28         BigDecimal v1=BigDecimal.valueOf(b1);
29         BigDecimal v2=BigDecimal.valueOf(b2);
30         return v1.subtract(v2).doubleValue();
31     }
32     
33     //
34     public static double mul(double b1,double b2)
35     {
36         BigDecimal v1=BigDecimal.valueOf(b1);
37         BigDecimal v2=BigDecimal.valueOf(b2);
38         return v1.multiply(v2).doubleValue();
39     }
40     
41     //提供(相对)精确的除法运算,当发生除不尽的情况时
42     //精确到小数带你以后10位的数字四舍五入
43     public static double div(double b1,double b2)
44     {
45         BigDecimal v1=BigDecimal.valueOf(b1);
46         BigDecimal v2=BigDecimal.valueOf(b2);
47         return v1.divide(v2, DEY_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
48     }
49 }

 

posted @ 2018-11-29 21:17  静心*尽力  阅读(232)  评论(0编辑  收藏  举报