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 }