package com.zy.asrs.framework.common; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.math.RoundingMode; 
 | 
  
 | 
/** 
 | 
 * 四则运算 
 | 
 * Created by vincent on 2019-04-15 
 | 
 */ 
 | 
public class Arith { 
 | 
  
 | 
    /** 
 | 
     * 加法 
 | 
     * @param dot 保留小数点 
 | 
     * @param numbers 数字类型 
 | 
     */ 
 | 
    public static double add(int dot, Number... numbers) { 
 | 
        return getAirth(dot, ArithType.ADD.getValue(), numbers); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 减法 
 | 
     * @param dot 保留小数点 
 | 
     * @param numbers 第一个是被减数 
 | 
     */ 
 | 
    public static double subtract(int dot, Number... numbers) { 
 | 
        return getAirth(dot, ArithType.SUBTRACT.getValue(), numbers); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 乘法 
 | 
     * @param dot 保留小数点 
 | 
     * @param numbers 乘法的因子 
 | 
     */ 
 | 
    public static double multiplys(int dot, Number... numbers) { 
 | 
        return getAirth(dot, ArithType.MULTIPLY.getValue(), numbers); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 除法 
 | 
     * @param dot 保留小数点 
 | 
     * @param numbers 除数,第一个是除数 
 | 
     */ 
 | 
    public static double divides(int dot, Number... numbers) { 
 | 
        return getAirth(dot, ArithType.DIVIDE.getValue(), numbers); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取百分比 
 | 
     * @param numbers 除数,第一个是除数 
 | 
     * @return 百分数 * 100 
 | 
     */ 
 | 
    public static int percentage(Number... numbers){ 
 | 
        return (int) (divides(2,numbers) * 100); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 余数 
 | 
     * @param numbers 
 | 
     * @return 
 | 
     */ 
 | 
    public static double remainder(Number... numbers){ 
 | 
        return new BigDecimal(numbers[0].toString()).remainder(new BigDecimal(String.valueOf(numbers[1]))).doubleValue(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 综合的运算 
 | 
     * @param dot       保留精度 
 | 
     * @param arithType 运算的类型 
 | 
     * @param numbers   需要运算的数字 
 | 
     */ 
 | 
    private static double getAirth(int dot, int arithType, Number... numbers) { 
 | 
        if (numbers == null || numbers.length == 0) { 
 | 
            return 0.0; 
 | 
        } 
 | 
        BigDecimal bigDecimal = new BigDecimal(numbers[0].toString()); 
 | 
        for (int i = 1; i < numbers.length; i++) { 
 | 
            switch (arithType) { 
 | 
                case 0: 
 | 
                    bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(numbers[i]))); 
 | 
  
 | 
                    break; 
 | 
                case 1: 
 | 
                    bigDecimal = bigDecimal.divide(new BigDecimal(String.valueOf(numbers[i])), dot, RoundingMode.HALF_UP); 
 | 
                    break; 
 | 
                case 2: 
 | 
                    bigDecimal = bigDecimal.subtract(new BigDecimal(String.valueOf(numbers[i]))); 
 | 
                    break; 
 | 
                case 3: 
 | 
                    bigDecimal = bigDecimal.multiply(new BigDecimal(String.valueOf(numbers[i]))); 
 | 
                    break; 
 | 
                default: 
 | 
                    return 0.00; 
 | 
            } 
 | 
        } 
 | 
        return bigDecimal.setScale(dot, RoundingMode.HALF_UP).doubleValue(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 运算的类型 
 | 
     */ 
 | 
    private enum ArithType { 
 | 
        ADD("add", 0), 
 | 
        DIVIDE("divide", 1), 
 | 
        SUBTRACT("subtract", 2), 
 | 
        MULTIPLY("multiply", 3); 
 | 
        @SuppressWarnings("unused") 
 | 
        private String key; 
 | 
        private int value; 
 | 
        ArithType(String key, int value) { 
 | 
            this.key = key; 
 | 
            this.value = value; 
 | 
        } 
 | 
        public int getValue() { 
 | 
            return value; 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |