java防止计算时精度丢失

在double,float类型之间做计算经常会出现精度丢失的情况,用BigDecimal类进行计算就不会出现这种精度丢失的情况了,所以封装了加减乘除的方法,方便使用。

 1 import java.math.BigDecimal;
 2 
 3 
 4 /**
 5  * 精确计算(防止精度丢失)
 6  * 
 7  * @author Administrator
 8  *
 9  */
10 public class ArithUtil {
11 
12     
13     /**
14      * 提供精确加法计算的add方法
15      * 
16      * @param value1 被加数
17      * @param value2 加数
18      * @return 两个参数的和
19      */
20     public static double add(double value1, double value2) {
21         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
22         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
23         return b1.add(b2).doubleValue();
24     }
25 
26     /**
27      * 提供精确减法运算的sub方法
28      * 
29      * @param value1 被减数
30      * @param value2 减数
31      * @return 两个参数的差
32      */
33     public static double sub(double value1, double value2) {
34         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
35         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
36         return b1.subtract(b2).doubleValue();
37     }
38 
39     /**
40      * 提供精确乘法运算的mul方法
41      * 
42      * @param value1 被乘数
43      * @param value2 乘数
44      * @return 两个参数的积
45      */
46     public static double mul(double value1, double value2) {
47         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
48         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
49         return b1.multiply(b2).doubleValue();
50     }
51 
52     /**
53      * 提供精确的除法运算方法div
54      * 
55      * @param value1 被除数
56      * @param value2  除数
57      * @param scale 精确范围
58      * @return 两个参数的商
59      * @throws IllegalAccessException
60      */
61     public static double div(double value1, double value2, int scale)
62             throws IllegalAccessException {
63         // 如果精确范围小于0,抛出异常信息
64         if (scale < 0) {
65             throw new IllegalAccessException("精确度不能小于0");
66         }
67         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
68         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
69         return b1.divide(b2, scale).doubleValue();
70     }
71     
72     /**
73      * 四舍五入保留两位小数
74      * @param f
75      * @return
76      */
77     public static double fixedNumber(double f) {
78         BigDecimal bg = new BigDecimal(f);
79         double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
80         return f1;
81     }
82     
83     
84 }

 

posted @ 2018-01-12 17:14  花生福  阅读(4835)  评论(0编辑  收藏  举报