Просмотр исходного кода

暂解决 目前计算精度问题

jubs 2 месяцев назад
Родитель
Сommit
99d0322916

+ 16 - 10
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/common/utils/jep/JEPUtils.java

@@ -9,7 +9,9 @@ import com.ruoyi.project.business.enums.CalculateResultEnum;
 import com.ruoyi.project.business.enums.InputTypeEnum;
 import com.ruoyi.project.business.enums.JEPFuncEnum;
 import com.ruoyi.project.business.enums.JEPSplitEnum;
+
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -18,6 +20,7 @@ import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
@@ -60,7 +63,7 @@ public class JEPUtils {
      * @date: 2024/6/13 14:20
      **/
     public static Map<String, Object> calculate(String formula, Map<String, Object> map,
-        Map<String, String> paramInputType, Boolean isDebug) {
+                                                Map<String, String> paramInputType, Boolean isDebug) {
         Map<String, Object> result = new HashMap<>();
         List<String> encipherdList = new ArrayList<>();
 
@@ -93,12 +96,12 @@ public class JEPUtils {
         for (String param : map.keySet()) {
             if (!isDebug) {
                 log.info("加密后的入参:{}",
-                    JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey());
+                        JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey());
                 encipherdList.add(
-                    JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey());
+                        JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey());
                 jep.addVariable(
-                    JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey(),
-                    map.get(param));
+                        JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey() + param + JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey(),
+                        map.get(param));
             } else {
                 log.info("加密后的入参:{}", param);
                 encipherdList.add(param);
@@ -109,7 +112,7 @@ public class JEPUtils {
                         case INPUT:
                         case SELECT:
                         case INPUT_SELECT:
-                            String paramStr = (String)map.get(param);
+                            String paramStr = (String) map.get(param);
                             if (StringUtils.isNotBlank(paramStr)) {
                                 boolean isNumberFlag = NumberUtils.isCreatable(paramStr);
                                 jep.addVariable(param, isNumberFlag ? new BigDecimal(paramStr) : paramStr);
@@ -121,7 +124,7 @@ public class JEPUtils {
                             break;
                         case INPUT_NUMBER:
                         case INPUT_DECIMAL:
-                            String paramStr1 = (String)map.get(param);
+                            String paramStr1 = (String) map.get(param);
                             if (Objects.nonNull(paramStr1)) {
                                 jep.addVariable(param, new BigDecimal(paramStr1));
                                 log.info("入参值:{}", new BigDecimal(paramStr1));
@@ -152,9 +155,12 @@ public class JEPUtils {
         result.put(CALCULATE_VALUE, jep.getValue() + "");
         try {
             BigDecimal objValue = new BigDecimal(jep.getValueAsObject() + "");
+            objValue = objValue.stripTrailingZeros();
+            objValue = objValue.setScale(2, RoundingMode.HALF_UP);
             result.put(OBJECT_CALCULATE_VALUE, objValue.stripTrailingZeros().toPlainString());
         } catch (Exception e) {
             result.put(OBJECT_CALCULATE_VALUE, jep.getValueAsObject() + "");
+            log.info("JEPUTils 计算结果 数值格式化失败,使用原始值:{}", jep.getValueAsObject());
             log.error("JEPUtils 计算结果格式化失败", e);
         }
         return result;
@@ -206,11 +212,11 @@ public class JEPUtils {
         //替换掉其中的 $_$、$@$ 按照长度 倒序排序
         if (paramList.size() > 0) {
             paramList = paramList.stream().map(item -> item.replace(JEPSplitEnum.PARAM_SPLIT_FLAG.getFuncKey(), ""))
-                .collect(Collectors.toList());
+                    .collect(Collectors.toList());
         }
         if (funcList.size() > 0) {
             funcList = funcList.stream().map(item -> item.replace(JEPSplitEnum.FUNC_SPLIT_FLAG.getFuncKey(), ""))
-                .collect(Collectors.toList());
+                    .collect(Collectors.toList());
         }
 
         paramList.sort((o1, o2) -> o2.length() - o1.length());
@@ -220,7 +226,7 @@ public class JEPUtils {
         for (String s : funcList) {
             JEPFuncEnum funcEnum = JEPFuncEnum.fromByKey(s);
             formula = formula.replace(JEPSplitEnum.FUNC_SPLIT_FLAG.getFuncKey(), "")
-                .replace(funcEnum.getFuncKey(), funcEnum.getFuncValue());
+                    .replace(funcEnum.getFuncKey(), funcEnum.getFuncValue());
 
         }