bigdecimal 平均数_BigDecimal精确计算工具类

前言

在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算。而这类操作通常都是可预知的,也就是通用的。所以,写了个工具类来方便以后的工作。

这是仓库地址:仓库地址

BigDecimal的构建

一般而言,我们主要从int,long,double,float来进行计算,在构建的时候推荐使用

BigDecimal BigDecimal(String s);

因为通过double构造会损失精度,而String构造是固定的值。

创建以下方法作为通用BigDecimal转化器:

/**

* Number -> BigDecimal

*/

public static BigDecimal transform(T v) {

if (v instanceof Double) {

return new BigDecimal(Double.toString((Double) v));

} else if (v instanceof Integer) {

return new BigDecimal(Integer.toString((Integer) v));

} else if (v instanceof Long) {

return new BigDecimal(Long.toString((Long) v));

} else if (v instanceof Short) {

return new BigDecimal(Short.toString((Short) v));

} else if (v instanceof Float) {

return new BigDecimal(Float.toString((Float) v));

} else {

return (BigDecimal) v;

}

}

BigDecimal方法

计算类型加减乘除四种,BigDecimal提供的方法也是围绕这四种计算类型设计的。

BigDecimal add(BigDecimal augend) //加

BigDecimal subtract(BigDecimal subtrahend) //减

BigDecimal multiply(BigDecimal multiplicand) //乘

BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) //除

工具类在加减乘除基础上,提供了

链式计算,类似JDK8 lamada api,爽快丝滑的编程体验

支持集合求和、求平均

支持复合计算,例如2*(2+8)

BigDecimal精确计算工具类实用案例

精确转换为BigDecimal,不指定精度

System.out.println(PreciseCalculations.transform(121.11)); //转化double -> 121.11

System.out.println(PreciseCalculations.transform(Integer.MAX_VALUE)); //转化int -> 2147483647

System.out.println(PreciseCalculations.transform(Short.MAX_VALUE)); //转化Short -> 32767

System.out.println(PreciseCalculations.transform(Long.MAX_VALUE)); //转化long -> 9223372036854775807

System.out.println(PreciseCalculations.transform(121.19F)); //转化float -> 121.19

精确转换为BigDecimal,指定精度

System.out.println(PreciseCalculations.transform(121.1111111111, 5)); //精度大于指定精度 -> 121.11111

System.out.println(PreciseCalculations.transform(121.11, 5)); //精度小于指定精度,补零 -> 121.11000

加减乘除

System.out.println(PreciseCalculations.add(12.11, 12.11)); //加法 -> 24.22

System.out.println(PreciseCalculations.subtract(12.11, 12.11)); //减法 -> 0.00

System.out.println(PreciseCalculations.multiply(12.11, 12.11)); //乘法 -> 146.6521

System.out.println(PreciseCalculations.divide(12.11, 2.35, 5)); //除法 -> 5.15319

负数计算

// -1.11 * 13 - 90 = -104.43

System.out.println(new PreciseCalculation(-1.11).multiply(13).add(-90).getValue());

// -11.11111111 + 90 = 78.88888889

System.out.println(PreciseCalculations.add(-11.11111111,90));

集合 求和 求平均值

List list = Arrays.asList(12.11D, 13.11D, 14.11D, 15.321312D);

System.out.println(PreciseCalculations.sum(list)); //求和 -> Optional[54.651312]

System.out.println(PreciseCalculations.average(list)); //平均值 -> Optional[13.66283]

System.out.println(PreciseCalculations.average(Collections.emptyList())); //空集合 -> Optional.empty

复合计算

// 计算 121.11 * 13 / 60 + 100 - 12 = 114.24050

System.out.println(new PreciseCalculation(121.11).multiply(13).divide(60, 5).add(100).subtract(12).getValue());

//计算 121.11 * 128.59 / (100 + 12) - 100 = 39.04942

System.out.println(new PreciseCalculation(121.11).multiply(128.59).divide(

new PreciseCalculation(100).add(12), 5).subtract(100).getValue());

注意事项

PreciseCalculation 核心类,提供加减乘除、集合精确计算方法,内部维护value值,每次计算该value都会改变。

PreciseCalculations 基于上述的工具类,方便简单计算时使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值