importjava.math.BigDecimal;importjava.math.RoundingMode;/*** java精确计算工具
*
*@authorwzm
*@version1.0.0
* @date 2020/1/25 14:15
**/
public classBigDecUtils {/*** 提供精确加法计算的add方法(整数运算)*/
public staticString add(String val1, String val2) {return add(val1, val2, 0, 0);
}/*** 提供精确加法计算的add方法(默认四舍五入)
*
*@paramval1 被加数
*@paramval2 加数
*@paramscale 精确范围(小数点后几位)*/
public static String add(String val1, String val2, intscale) {returnadd(val1, val2, scale, BigDecimal.ROUND_HALF_UP);
}/*** 提供精确加法计算的add方法
*
*@paramval1 被加数
*@paramval2 加数
*@paramscale 精确范围(小数点后几位)
*@paramroundMode 精確模式*/
public static String add(String val1, String val2, int scale, introundMode) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);
BigDecimal result=b1.add(b2);//mode为0,则不需要精确
if (roundMode != 0) {
result=result.setScale(scale, roundMode);
}returnresult.toString();
}/*** 提供精确减法运算的subtract方法
*
*@paramval1 被减数
*@paramval2 减数
*@return两个参数的差*/
public staticString sub(String val1, String val2) {return sub(val1, val2, 0, 0);
}/*** 提供精确减法运算的subtract方法(默認四捨五入)
*
*@paramval1 被减数
*@paramval2 减数
*@paramscale 精确范围(小数点后几位)*/
public static String sub(String val1, String val2, intscale) {returnsub(val1, val2, scale, BigDecimal.ROUND_HALF_UP);
}/*** 提供精确减法运算的subtract方法
*
*@paramval1 被减数
*@paramval2 减数
*@paramscale 精确范围(小数点后几位)
*@paramroundMode 精確模式*/
public static String sub(String val1, String val2, int scale, introundMode) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);
BigDecimal result=b1.subtract(b2);//mode为0,则不需要精确
if (roundMode != 0) {
result=result.setScale(scale, roundMode);
}returnresult.toString();
}/*** 提供精确的除法运算方法divide
*
*@paramval1 被除数
*@paramval2 除数*/
public static String div(String val1, String val2) throwsIllegalAccessException {return div(val1, val2, 0, null);
}/*** 提供精确的除法运算方法divide(默認四捨五入)
*
*@paramval1 被除数
*@paramval2 除数
*@paramscale 精确范围(小数点后几位)*/
public static String div(String val1, String val2, int scale) throwsIllegalAccessException {returndiv(val1, val2, scale, RoundingMode.HALF_UP);
}/*** 提供精确的除法运算方法divide
*
*@paramval1 被除数
*@paramval2 除数
*@paramscale 精确范围(小数点后几位)
*@paramroundingMode 精確模式*/
public static String div(String val1, String val2, intscale, RoundingMode roundingMode)throwsIllegalAccessException {//如果精确范围小于0,抛出异常信息
if (scale < 0) {throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);//roundingMode为null,则不需要精确
if (roundingMode != null) {returnDouble.toString(b1.divide(b2, scale, roundingMode).doubleValue());
}else{return Double.toString(b1.divide(b2, 0).doubleValue());
}
}/*** 提供精确乘法运算的multiply方法
*
*@paramval1 被乘数
*@paramval2 乘数
*@return两个参数的积*/
public staticString mul(String val1, String val2) {return mul(val1, val2, 0, 0);
}/*** 提供精确乘法运算的multiply方法(默認四捨五入)
*
*@paramval1 被乘数
*@paramval2 乘数
*@paramscale 精确范围(小数点后几位)*/
public static String mul(String val1, String val2, intscale) {returnmul(val1, val2, scale, BigDecimal.ROUND_HALF_UP);
}/*** 提供精确乘法运算的multiply方法
*
*@paramval1 被乘数
*@paramval2 乘数
*@paramscale 精确范围(小数点后几位)
*@paramroundMode 舍入模式*/
public static String mul(String val1, String val2, int scale, introundMode) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);
BigDecimal result=b1.multiply(b2);//mode为0,则不需要精确
if (roundMode != 0) {
result=result.setScale(scale, roundMode);
}returnresult.toString();
}/*** 比较大小 :返回较大的那个
*
*@paramval1 v1
*@paramval2 v2*/
public staticString max(String val1, String val2) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);returnDouble.toString(b1.max(b2).doubleValue());
}/*** 比较大小 :返回较小的那个
*
*@paramval1 v1
*@paramval2 v2*/
public staticString min(String val1, String val2) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);returnDouble.toString(b1.min(b2).doubleValue());
}/*** 比较大小
* if(r==0) v1等于v2
* if(r==1) v1大于v2
* if(r==-1) v1小于v2
*
*@paramval1 v1
*@paramval2 v2
*@paramscale 精确范围
*@paramroundMode 舍入模式*/
public static int compare(String val1, String val2, int scale, introundMode) {
BigDecimal b1= newBigDecimal(val1);
BigDecimal b2= newBigDecimal(val2);
BigDecimal result=b1.subtract(b2);//mode为0,则不需要精确
if (roundMode != 0) {
result=result.setScale(scale, roundMode);
}returnresult.compareTo(BigDecimal.ZERO);
}public static void main(String[] args) throwsIllegalAccessException {
System.out.println(add("10", "5"));
System.out.println(sub("10", "5"));
System.out.println(mul("10", "5"));
System.out.println(div("10", "5"));
System.out.println(compare("-10", "5", 2, BigDecimal.ROUND_HALF_UP));
System.out.println(max("10", "5"));
System.out.println(min("10", "5"));
BigDecimal v1= new BigDecimal("-1");
BigDecimal v2= new BigDecimal("3");int r =v1.compareTo(v2);
System.out.println(r);
}
}