前言
在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算。而这类操作通常都是可预知的,也就是通用的。所以,写了个工具类来方便以后的工作。
这是仓库地址:仓库地址
BigDecimal的构建
一般而言,我们主要从int,long,double,float来进行计算,在构建的时候推荐使用
1
| BigDecimal BigDecimal(String s);
|
因为通过double构造会损失精度,而String构造是固定的值。
创建以下方法作为通用BigDecimal转化器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public static <T extends Number> 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提供的方法也是围绕这四种计算类型设计的。
1 2 3 4
| 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,不指定精度
1 2 3 4 5
| System.out.println(PreciseCalculations.transform(121.11)); System.out.println(PreciseCalculations.transform(Integer.MAX_VALUE)); System.out.println(PreciseCalculations.transform(Short.MAX_VALUE)); System.out.println(PreciseCalculations.transform(Long.MAX_VALUE)); System.out.println(PreciseCalculations.transform(121.19F));
|
精确转换为BigDecimal,指定精度
1 2
| System.out.println(PreciseCalculations.transform(121.1111111111, 5)); System.out.println(PreciseCalculations.transform(121.11, 5));
|
加减乘除
1 2 3 4
| System.out.println(PreciseCalculations.add(12.11, 12.11)); System.out.println(PreciseCalculations.subtract(12.11, 12.11)); System.out.println(PreciseCalculations.multiply(12.11, 12.11)); System.out.println(PreciseCalculations.divide(12.11, 2.35, 5));
|
负数计算
1 2 3 4
| System.out.println(new PreciseCalculation(-1.11).multiply(13).add(-90).getValue());
System.out.println(PreciseCalculations.add(-11.11111111,90));
|
集合 求和 求平均值
1 2 3 4
| List<Double> list = Arrays.asList(12.11D, 13.11D, 14.11D, 15.321312D); System.out.println(PreciseCalculations.sum(list)); System.out.println(PreciseCalculations.average(list)); System.out.println(PreciseCalculations.average(Collections.emptyList()));
|
复合计算
1 2 3 4 5
| System.out.println(new PreciseCalculation(121.11).multiply(13).divide(60, 5).add(100).subtract(12).getValue());
System.out.println(new PreciseCalculation(121.11).multiply(128.59).divide( new PreciseCalculation(100).add(12), 5).subtract(100).getValue());
|
注意事项
- PreciseCalculation 核心类,提供加减乘除、集合精确计算方法,内部维护value值,每次计算该value都会改变。
- PreciseCalculations 基于上述的工具类,方便简单计算时使用。