package com.core.common; import java.math.BigDecimal; import java.math.RoundingMode; public class Arith { private enum ArithType { ADD(0), DIVIDE(1), SUBTRACT(2), MULTIPLY(3); private final int value; ArithType(int value) { this.value = value; } public int getValue() { return value; } } public static double add(int scale, Number... nums) { return getAirth(scale, ArithType.ADD.getValue(), nums); } public static double subtract(int scale, Number... nums) { return getAirth(scale, ArithType.SUBTRACT.getValue(), nums); } public static double multiplys(int scale, Number... nums) { return getAirth(scale, ArithType.MULTIPLY.getValue(), nums); } public static double divides(int scale, Number... nums) { return getAirth(scale, ArithType.DIVIDE.getValue(), nums); } public static int percentage(Number... nums) { return (int) (divides(2, nums) * 100); } public static double remainder(Number... nums) { return new BigDecimal(nums[0].toString()) .remainder(new BigDecimal(String.valueOf(nums[1]))) .doubleValue(); } private static double getAirth(int scale, int type, Number... nums) { if (nums == null || nums.length == 0) { return 0D; } BigDecimal result = new BigDecimal(nums[0].toString()); for (int i = 1; i < nums.length; i++) { BigDecimal current = new BigDecimal(String.valueOf(nums[i])); switch (type) { case 0: result = result.add(current); break; case 1: result = result.divide(current, scale, RoundingMode.HALF_UP); break; case 2: result = result.subtract(current); break; case 3: result = result.multiply(current); break; default: return 0D; } } return result.setScale(scale, RoundingMode.HALF_UP).doubleValue(); } }