java 计算工具类_java精确计算工具类

importjava.math.BigDecimal;importjava.math.RoundingMode;importjava.math.BigDecimal;importjava.text.DecimalFormat;importorg.springframework.stereotype.Component;/*** 工具类 - 运算*/@Componentpublic classArithUtils {//默认除法运算精度

private static final int DEF_DIV_SCALE = 10;privateArithUtils() {

}/*** 提供精确的加法运算。如果参数为null,则视为0处理。

*

*@paramv1

* 被加数

*@paramv2

* 加数

*@return两个参数的和*/

public static doubleadd(Double v1, Double v2) {

BigDecimal b1= new BigDecimal(Double.toString(v1==null?0D:v1));

BigDecimal b2= new BigDecimal(Double.toString(v2==null?0D:v2));returnb1.add(b2).doubleValue();

}/*** 提供精确的加法运算。

*

*@paramvs

* 加数

*@return和*/

public static doubleadd(Double... vs) {

BigDecimal b1= new BigDecimal(0);for(Double d : vs) {

BigDecimal b2= new BigDecimal(Double.toString(d==null?0D:d));

b1=b1.add(b2);

}returnb1.doubleValue();

}/*** 提供精确的减法运算。

*

*@paramv1

* 被减数

*@paramv2

* 减数

*@return两个参数的差*/

public static double sub(double v1, doublev2) {

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.subtract(b2).doubleValue();

}/*** 提供精确的乘法运算。

*

*@paramv1

* 被乘数

*@paramv2

* 乘数

*@return两个参数的积*/

public static double mul(double v1, doublev2) {

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.multiply(b2).doubleValue();

}/*** 提供精确的乘法运算。

*

*@return多个values的乘积*/

public static doublemul(Double... values) {

BigDecimal result= new BigDecimal(1);for(Double value : values){

result= result.multiply( newBigDecimal(Double.toString(value)) );

}returnresult.doubleValue();

}/*** 提供精确的乘法运算。

*

*@paramv1

* 被乘数

*@paramv2

* 乘数

*@return两个参数的积*/

public static double mul(double v1, double v2, intscale) {

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnArithUtils.round(b1.multiply(b2).doubleValue(), scale);

}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。

*

*@paramv1

* 被除数

*@paramv2

* 除数

*@return两个参数的商*/

public static double div(double v1, doublev2) {returndiv(v1, v2, DEF_DIV_SCALE);

}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。

*

*@paramv1

* 被除数

*@paramv2

* 除数

*@paramscale

* 表示表示需要精确到小数点以后几位。

*@return两个参数的商*/

public static double div(double v1, double v2, intscale) {if (scale < 0) {throw new IllegalArgumentException("参数scale必须为整数为零!");

}

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}/*** 提供精确的小数位四舍五入处理。

*

*@paramv

* 需要四舍五入的数字

*@paramscale

* 小数点后保留几位

*@return四舍五入后的结果*/

public static double round(double v, intscale) {if (scale < 0) {throw new IllegalArgumentException("参数scale必须为整数或零!");

}

BigDecimal b= newBigDecimal(Double.toString(v));

BigDecimal one= new BigDecimal("1");returnb.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}/*** 提供精确的类型转换(Float)

*

*@paramv

* 需要被转换的数字

*@return返回转换结果*/

public static float convertsToFloat(doublev) {

BigDecimal b= newBigDecimal(v);returnb.floatValue();

}/*** 提供精确的类型转换(Int)不进行四舍五入

*

*@paramv

* 需要被转换的数字

*@return返回转换结果*/

public static int convertsToInt(doublev) {

BigDecimal b= newBigDecimal(v);returnb.intValue();

}/*** 提供精确的类型转换(Long)

*

*@paramv

* 需要被转换的数字

*@return返回转换结果*/

public static long convertsToLong(doublev) {

BigDecimal b= newBigDecimal(v);returnb.longValue();

}/*** 返回两个数中大的一个值

*

*@paramv1

* 需要被对比的第一个数

*@paramv2

* 需要被对比的第二个数

*@return返回两个数中大的一个值*/

public static double returnMax(double v1, doublev2) {

BigDecimal b1= newBigDecimal(v1);

BigDecimal b2= newBigDecimal(v2);returnb1.max(b2).doubleValue();

}/*** 返回两个数中小的一个值

*

*@paramv1

* 需要被对比的第一个数

*@paramv2

* 需要被对比的第二个数

*@return返回两个数中小的一个值*/

public static double returnMin(double v1, doublev2) {

BigDecimal b1= newBigDecimal(v1);

BigDecimal b2= newBigDecimal(v2);returnb1.min(b2).doubleValue();

}/*** 精确比较两个数字

*

*@paramv1

* 需要被对比的第一个数

*@paramv2

* 需要被对比的第二个数

*@return如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1*/

public static int compareTo(double v1, doublev2) {

BigDecimal b1= newBigDecimal(v1);

BigDecimal b2= newBigDecimal(v2);returnb1.compareTo(b2);

}/*** 获取数字小数位数

*

*@paramnumber

* 数字.

*

*@return小数位数*/

public static int getDecimals(doublenumber) {

DecimalFormat decimalFormat= new DecimalFormat("#.####");

String numberString=decimalFormat.format(number);if (numberString.indexOf(".") > 0) {return numberString.length() - String.valueOf(number).indexOf(".")- 1;

}else{return 0;

}

}/*** 获取数字小数位数

*

*@paramnumber

* 数字.

*

*@return小数位数*/

public static int getDecimals(floatnumber) {

DecimalFormat decimalFormat= new DecimalFormat("#.####");

String numberString=decimalFormat.format(number);if (numberString.indexOf(".") > 0) {return numberString.length() - String.valueOf(number).indexOf(".")- 1;

}else{return 0;

}

}/*** 对double数据进行取精度.

*

*@paramvalue

* double数据.

*@paramscale

* 精度位数(保留的小数位数).

*@paramroundingMode : BigDecimal.ROUND_FLOOR(舍去scale位数后所有)

* 精度取值方式.

*@return精度计算后的数据.*/

public static double round(double value, int scale, introundingMode) {

BigDecimal bd= newBigDecimal(value);

bd=bd.setScale(scale, roundingMode);double d =bd.doubleValue();

bd= null;returnd;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值