Browse Source

update utils

deason 2 năm trước cách đây
mục cha
commit
8661c988e8

+ 102 - 0
examcloud-commons/src/main/java/cn/com/qmth/examcloud/commons/util/MathUtils.java

@@ -0,0 +1,102 @@
+package cn.com.qmth.examcloud.commons.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+
+public class MathUtils {
+
+    /**
+     * 加法运算(高精度)
+     */
+    public static double add(double value1, double value2) {
+        return new BigDecimal(Double.toString(value1))
+                .add(new BigDecimal(Double.toString(value2)))
+                .doubleValue();
+    }
+
+    /**
+     * 减法运算(高精度)
+     */
+    public static double subtract(double value1, double value2) {
+        return new BigDecimal(Double.toString(value1))
+                .subtract(new BigDecimal(Double.toString(value2)))
+                .doubleValue();
+    }
+
+    /**
+     * 乘法运算(高精度)
+     */
+    public static double multiply(double value1, double value2) {
+        return new BigDecimal(Double.toString(value1))
+                .multiply(new BigDecimal(Double.toString(value2)))
+                .doubleValue();
+    }
+
+    /**
+     * 除法运算(高精度)
+     */
+    public static double divide(double value1, double value2) {
+        if (value2 == 0d) {
+            return 0d;
+        }
+        return new BigDecimal(Double.toString(value1))
+                // 默认精度小数点后保留10位,超出位数则四舍五入
+                .divide(new BigDecimal(Double.toString(value2)), 10, RoundingMode.HALF_UP)
+                .doubleValue();
+    }
+
+    /**
+     * 计算百分比 (默认保留2位小数,超出位数则截断不四舍五入)
+     */
+    public static double percentage(double value1, double value2) {
+        if (value2 == 0d) {
+            return 0d;
+        }
+        double x = value1 * 100d / value2;
+        BigDecimal _value = new BigDecimal(Double.toString(x));
+        BigDecimal one = new BigDecimal("1");
+        return _value.divide(one, 2, RoundingMode.DOWN).doubleValue();
+    }
+
+    /**
+     * 数值保留2位小数(默认四舍五入)
+     */
+    public static double round(double value) {
+        return round(value, 2);
+    }
+
+    /**
+     * 数值保留n位小数(默认四舍五入)
+     *
+     * @param value 数值
+     * @param n     小数点后保留几位
+     * @return
+     */
+    public static double round(double value, int n) {
+        if (n < 0) n = 0;
+        BigDecimal _value = new BigDecimal(Double.toString(value));
+        BigDecimal one = new BigDecimal("1");
+        return _value.divide(one, n, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    /**
+     * 数值保留n位小数(默认四舍五入)
+     *
+     * @param value 数值
+     * @param n     小数点后保留几位
+     * @return
+     */
+    public static String roundStr(double value, int n) {
+        StringBuilder pattern = new StringBuilder("#");
+        if (n > 1) pattern.append(".");
+        for (int i = 0; i < n; i++) {
+            pattern.append("#");
+        }
+
+        DecimalFormat df = new DecimalFormat(pattern.toString());
+        df.setRoundingMode(RoundingMode.HALF_UP);
+        return df.format(value);
+    }
+
+}