123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- 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<Double> 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);
- }
- }
|