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