java 精确 计算_Java精确计算

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);

}

}


版权声明:本文为weixin_39753857原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。