BigDecimal精確計算工具類

前言

在實際開發中,遇到例如貨幣,統計等商業計算的時候,通常須要採用java.math.BigDecimal類來進行精確計算。而這類操做一般都是可預知的,也就是通用的。因此,寫了個工具類來方便之後的工做。
這是倉庫地址:倉庫地址java

BigDecimal的構建

通常而言,咱們主要從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提供的方法也是圍繞這四種計算類型設計的。編程

BigDecimal add(BigDecimal augend) //加
BigDecimal subtract(BigDecimal subtrahend) //減
BigDecimal multiply(BigDecimal multiplicand) //乘
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) //除

工具類在加減乘除基礎上,提供了api

  1. 鏈式計算,相似JDK8 lamada api,爽快絲滑的編程體驗
  2. 支持集合求和、求平均
  3. 支持複合計算,例如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<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());

注意事項

  • PreciseCalculation 核心類,提供加減乘除、集合精確計算方法,內部維護value值,每次計算該value都會改變。
  • PreciseCalculations 基於上述的工具類,方便簡單計算時使用。
相關文章
相關標籤/搜索