package cn.com.qmth.scancentral.util; import java.math.BigDecimal; import java.util.List; import org.apache.commons.collections4.CollectionUtils; import com.qmth.boot.core.exception.StatusException; /** * 计算器 * */ public class Calculator { /** * 加法 * * @param v1 * @param v2 * @return */ public static double add(double v1, double v2) { return add(v1, v2, null); } /** * 加法 保留指定位小数 * * @param v1 * @param v2 * @param len * @return */ public static double add(double v1, double v2, Integer len) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (len == null) { return b1.add(b2).doubleValue(); } else { return b1.add(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } /** * 加法 保留指定位小数 * * @param ds * @param len * @return */ public static double add(List ds, int len) { if (CollectionUtils.isEmpty(ds)) { throw new StatusException("数组为空"); } BigDecimal ret = BigDecimal.valueOf(0.0); for (Double d : ds) { if (d == null) { throw new StatusException("数组元素为空"); } ret = ret.add(BigDecimal.valueOf(d)); } return ret.setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 减法 * * @param v1 * @param v2 * @return */ public static double subtract(double v1, double v2) { return subtract(v1, v2, null); } /** * 减法 保留指定位小数 * * @param v1 * @param v2 * @param len * @return */ public static double subtract(double v1, double v2, Integer len) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (len == null) { return b1.subtract(b2).doubleValue(); } else { return b1.subtract(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } /** * 差值绝对值 * * @param v1 * @param v2 * @param len * @return */ public static double absoluteDiff(double v1, double v2, Integer len) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (v1 > v2) { if (len == null) { return b1.subtract(b2).doubleValue(); } else { return b1.subtract(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } else { if (len == null) { return b2.subtract(b1).doubleValue(); } else { return b2.subtract(b1).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } } /** * 乘法 * * @param v1 * @param v2 * @return */ public static double multiply(double v1, double v2) { return multiply(v1, v2, null); } /** * 乘法 保留指定位小数 * * @param v1 * @param v2 * @param len * @return */ public static double multiply(double v1, double v2, Integer len) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (len == null) { return b1.multiply(b2).doubleValue(); } else { return b1.multiply(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } /** * 除法 * * @param v1 * @param v2 * @param len * @return */ public static double divide(double v1, double v2) { return divide(v1, v2, null); } /** * 除法 保留指定位小数 * * @param v1 * @param v2 * @param len * @return */ public static double divide(double v1, double v2, Integer len) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (len == null) { return b1.divide(b2).doubleValue(); } else { return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } public static String divide2String(Double v1, Double v2, Integer len) { if (v1 == null || v2 == null || v2 == 0) { return "-"; } BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); if (len == null) { return String.valueOf(b1.divide(b2).doubleValue()); } else { return String.valueOf(b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue()); } } /** * 返回百分比 99.3% * * @param v1 * 分子 * @param v2 * 分母 * @param len * 小数位数 * @return */ public static String percentage(Double v1, Double v2, Integer len) { if (v1 == null || v2 == null || v2 == 0) { return "-"; } BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); BigDecimal b3 = BigDecimal.valueOf(100); if (len == null) { return b1.multiply(b3).divide(b2).doubleValue() + "%"; } else { return b1.multiply(b3).divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue() + "%"; } } public static String percentage(Integer v1, Integer v2, Integer len) { if (v1 == null || v2 == null || v2 == 0) { return "-"; } return percentage(v1.doubleValue(), v2.doubleValue(), len); } public static String percentage(Integer v1, Integer v2) { if (v1 == null || v2 == null || v2 == 0) { return "-"; } return percentage(v1.doubleValue(), v2.doubleValue(), null); } public static String percentage(double v1, double v2) { return percentage(v1, v2, null); } }