在实际开发中,遇到例如货币,统计等商业计算的时候,通常须要采用java.math.BigDecimal类来进行精确计算。而这类操做一般都是可预知的,也就是通用的。因此,写了个工具类来方便之后的工做。
这是仓库地址:仓库地址java
通常而言,咱们主要从int,long,double,float来进行计算,在构建的时候推荐使用git
BigDecimal BigDecimal(String s);
由于经过double构造会损失精度,而String构造是固定的值。
建立如下方法做为通用BigDecimal转化器:github
/** * Number -> BigDecimal */ 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 add(BigDecimal augend) //加 BigDecimal subtract(BigDecimal subtrahend) //减 BigDecimal multiply(BigDecimal multiplicand) //乘 BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) //除
工具类在加减乘除基础上,提供了api
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
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<Double> 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());