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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM