Java-精確計算工具類


  1 import java.math.BigDecimal;
  2 import java.math.RoundingMode;
  3 
  4 /**
  5  * 精確計算工具類(加,減,乘,除,返回較大值,返回較小值)
  6  */
  7 public class CalculationUtil {
  8 
  9     /**
 10      * 提供精確加法計算的add方法
 11      */
 12     public static String add(String value1, String value2) {
 13         return add(value1, value2, 0, 0);
 14     }
 15 
 16     /**
 17      * 提供精確加法計算的add方法(默認四捨五入)
 18      * @param value1 被加數
 19      * @param value2 加數
 20      * @param scale 精確范圍(小數點后幾位)
 21      */
 22     public static String add(String value1, String value2, int scale) {
 23         return add(value1, value2, scale, BigDecimal.ROUND_HALF_UP);
 24     }
 25 
 26     /**
 27      * 提供精確加法計算的add方法
 28      * @param value1 被加數
 29      * @param value2 加數
 30      * @param scale 精確范圍(小數點后幾位)
 31      * @param roundingMode 精確模式
 32      */
 33     public static String add(String value1, String value2, int scale, int mode) {
 34         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
 35         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
 36         BigDecimal result = b1.add(b2);
 37         // mode為0,則不需要精確
 38         if (mode != 0) {
 39             result = result.setScale(scale, mode);
 40         }
 41         return result.toString();
 42     }
 43 
 44     public static int compareTo(String value1, String value2, int scale, int mode) {
 45         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
 46         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
 47         BigDecimal result = b1.subtract(b2);
 48         // mode為0,則不需要精確
 49         if (mode != 0) {
 50             result = result.setScale(scale, mode);
 51         }
 52         return result.compareTo(BigDecimal.ZERO);
 53     }
 54 
 55     /**
 56      * 提供精確的除法運算方法divide
 57      * @param value1 被除數
 58      * @param value2 除數
 59      */
 60     public static String divide(String value1, String value2) throws IllegalAccessException {
 61         return divide(value1, value2, 0, null);
 62     }
 63 
 64     /**
 65      * 提供精確的除法運算方法divide(默認四捨五入)
 66      * @param value1 被除數
 67      * @param value2 除數
 68      * @param scale 精確范圍(小數點后幾位)
 69      */
 70     public static String divide(String value1, String value2, int scale) throws IllegalAccessException {
 71         return divide(value1, value2, scale, RoundingMode.HALF_UP);
 72     }
 73 
 74     /**
 75      * 提供精確的除法運算方法divide
 76      * 
 77      * @param value1 被除數
 78      * @param value2 除數
 79      * @param scale 精確范圍(小數點后幾位)
 80      * @param roundingMode 精確模式
 81      */
 82     public static String divide(String value1, String value2, int scale, RoundingMode roundingMode)
 83             throws IllegalAccessException {
 84         // 如果精確范圍小於0,拋出異常信息
 85         if (scale < 0) {
 86             throw new IllegalAccessException("精確度不能小於0");
 87         }
 88         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
 89         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
 90         // roundingMode為null,則不需要精確
 91         if (roundingMode != null) {
 92             return new Double(b1.divide(b2, scale, roundingMode).doubleValue()).toString();
 93         } else {
 94             return new Double(b1.divide(b2).doubleValue()).toString();
 95         }
 96     }
 97 
 98     /**
 99      * 比較大小 :返回較大的那個
100      */
101     public static String getMax(String value1, String value2) {
102         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
103         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
104         return new Double(b1.max(b2).doubleValue()).toString();
105     }
106 
107     /**
108      * 比較大小 :返回較小的那個
109      */
110     public static String getMin(String value1, String value2) {
111         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
112         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
113         return new Double(b1.min(b2).doubleValue()).toString();
114     }
115 
116 
117     /**
118      *
119      * 提供精確乘法運算的multiply方法
120      * @param value1 被乘數
121      * @param value2 乘數
122      * @return 兩個參數的積
123      */
124     public static String multiply(String value1, String value2) {
125         return multiply(value1, value2, 0, 0);
126     }
127 
128     /**
129      * 提供精確乘法運算的multiply方法(默認四捨五入)
130      * @param value1 被乘數
131      * @param value2 乘數
132      * @param scale 精確范圍(小數點后幾位)
133      */
134     public static String multiply(String value1, String value2, int scale) {
135         return multiply(value1, value2, scale, BigDecimal.ROUND_HALF_UP);
136     }
137 
138     /**
139      * 提供精確乘法運算的multiply方法
140      * @param value1 被乘數
141      * @param value2 乘數
142      * @param scale 精確范圍(小數點后幾位)
143      * @param roundingMode 精確模式
144      */
145     public static String multiply(String value1, String value2, int scale, int mode) {
146         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
147         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
148         BigDecimal result = b1.multiply(b2);
149         // mode為0,則不需要精確
150         if (mode != 0) {
151             result = result.setScale(scale, mode);
152         }
153         return result.toString();
154     }
155 
156     /**
157      * 提供精確減法運算的subtract方法
158      * @param value1 被減數
159      * @param value2 減數
160      * @return 兩個參數的差
161      */
162     public static String subtract(String value1, String value2) {
163         return subtract(value1, value2, 0, 0);
164     }
165 
166     /**
167      * 提供精確減法運算的subtract方法(默認四捨五入)
168      * @param value1 被減數
169      * @param value2 減數
170      * @param scale 精確范圍(小數點后幾位)
171      */
172     public static String subtract(String value1, String value2, int scale) {
173         return subtract(value1, value2, scale, BigDecimal.ROUND_HALF_UP);
174     }
175 
176     /**
177      * 提供精確減法運算的subtract方法
178      * @param value1 被減數
179      * @param value2 減數
180      * @param scale 精確范圍(小數點后幾位)
181      * @param roundingMode 精確模式
182      */
183     public static String subtract(String value1, String value2, int scale, int mode) {
184         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
185         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
186         BigDecimal result = b1.subtract(b2);
187         // mode為0,則不需要精確
188         if (mode != 0) {
189             result = result.setScale(scale, mode);
190         }
191         return result.toString();
192     }
193 }

 


免責聲明!

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



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