From 5e92ec1621a9fdca7a9d5a7cd5154a8701787668 Mon Sep 17 00:00:00 2001 From: zhangluping <1650370569@qq.com> Date: Sun, 25 Jan 2026 16:13:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E4=B8=AD=E5=87=BA=E7=8E=B0=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E8=BF=90=E7=AE=97=E5=92=8C=E4=BD=BF=E7=94=A8double?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E8=AE=A1=E7=AE=97=E7=B2=BE=E5=BA=A6=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BB=A5=E5=8F=8A=E7=A9=BA?= =?UTF-8?q?=E5=80=BC=E5=92=8C=E6=95=B0=E5=80=BC=E8=BF=9B=E8=A1=8C=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evaluator/expressions/MathExpression.java | 60 ++++++++++--------- .../NumericComparisonExpression.java | 6 ++ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/MathExpression.java b/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/MathExpression.java index e1d656b..64bf03a 100644 --- a/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/MathExpression.java +++ b/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/MathExpression.java @@ -3,27 +3,30 @@ import io.github.jamsesso.jsonlogic.evaluator.JsonLogicEvaluationException; import io.github.jamsesso.jsonlogic.utils.ArrayLike; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import java.util.function.BiFunction; public class MathExpression implements PreEvaluatedArgumentsExpression { - public static final MathExpression ADD = new MathExpression("+", Double::sum); - public static final MathExpression SUBTRACT = new MathExpression("-", (a, b) -> a - b, 2); - public static final MathExpression MULTIPLY = new MathExpression("*", (a, b) -> a * b); - public static final MathExpression DIVIDE = new MathExpression("/", (a, b) -> a / b, 2); - public static final MathExpression MODULO = new MathExpression("%", (a, b) -> a % b, 2); - public static final MathExpression MIN = new MathExpression("min", Math::min); - public static final MathExpression MAX = new MathExpression("max", Math::max); + public static final MathExpression ADD = new MathExpression("+", BigDecimal::add); + public static final MathExpression SUBTRACT = new MathExpression("-", BigDecimal::subtract, 2); + public static final MathExpression MULTIPLY = new MathExpression("*", BigDecimal::multiply); + public static final MathExpression DIVIDE = new MathExpression("/", + (a, b) -> a.divide(b, 10, RoundingMode.HALF_UP), 2); + public static final MathExpression MODULO = new MathExpression("%", BigDecimal::remainder, 2); + public static final MathExpression MIN = new MathExpression("min", BigDecimal::min); + public static final MathExpression MAX = new MathExpression("max", BigDecimal::max); private final String key; - private final BiFunction reducer; + private final BiFunction reducer; private final int maxArguments; - public MathExpression(String key, BiFunction reducer) { + public MathExpression(String key, BiFunction reducer) { this(key, reducer, 0); } - public MathExpression(String key, BiFunction reducer, int maxArguments) { + public MathExpression(String key, BiFunction reducer, int maxArguments) { this.key = key; this.reducer = reducer; this.maxArguments = maxArguments; @@ -41,48 +44,49 @@ public Object evaluate(List arguments, Object data, String jsonPath) throws Json } // Collect all of the arguments - double[] values = new double[arguments.size()]; + BigDecimal[] values = new BigDecimal[arguments.size()]; for (int i = 0; i < arguments.size(); i++) { Object value = arguments.get(i); + // 处理 null 和空字符串,默认为 0 + if (value == null || "".equals(value)) { + values[i] = BigDecimal.ZERO; + continue; + } + if (key.equals("*") || key.equals("+")) { while (ArrayLike.isEligible(value)) { - ArrayLike array = new ArrayLike(value); - if (array.isEmpty()) { - break; - } - value = array.get(0); + value = new ArrayLike(value).get(0); } } + if (value instanceof String) { try { - values[i] = Double.parseDouble((String) value); - } - catch (NumberFormatException e) { + values[i] = new BigDecimal((String) value); + } catch (NumberFormatException e) { return null; } - } - else if (!(value instanceof Number)) { + } else if (value instanceof BigDecimal) { + values[i] = (BigDecimal) value; + } else if (value instanceof Number) { + values[i] = new BigDecimal(value.toString()); + } else { return null; } - else { - values[i] = ((Number) value).doubleValue(); - } } if (values.length == 1) { if (key.equals("-")) { - return -values[0]; + return values[0].negate(); } - if (key.equals("/")) { return null; } } // Reduce the values into a single result - double accumulator = values[0]; + BigDecimal accumulator = values[0]; for (int i = 1; i < values.length && (i < maxArguments || maxArguments == 0); i++) { accumulator = reducer.apply(accumulator, values[i]); @@ -90,4 +94,4 @@ else if (!(value instanceof Number)) { return accumulator; } -} +} \ No newline at end of file diff --git a/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/NumericComparisonExpression.java b/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/NumericComparisonExpression.java index 98c98a4..83bf63f 100644 --- a/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/NumericComparisonExpression.java +++ b/src/main/java/io/github/jamsesso/jsonlogic/evaluator/expressions/NumericComparisonExpression.java @@ -35,6 +35,12 @@ public Object evaluate(List arguments, Object data, String jsonPath) throws Json for (int i = 0; i < n; i++) { Object value = arguments.get(i); + // 处理 null 和空字符串,默认为 0 + if (value == null || "".equals(value)) { + values[i] = 0.0; + continue; + } + if (value instanceof String) { try { values[i] = Double.parseDouble((String) value);