|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|