From ad8ed4c574e5b57225798c27ae1528a9372aa096 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 9 Mar 2023 18:19:02 -0600 Subject: [PATCH] Fix division by zero (check bigDecimal.compareto, not equals 0) --- .../backend/core/actions/reporting/FormulaInterpreter.java | 4 ++-- .../core/actions/reporting/FormulaInterpreterTest.java | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreter.java index 68d3c7f5..7fc76fa8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreter.java @@ -185,7 +185,7 @@ public class FormulaInterpreter case "DIVIDE": { List numbers = getNumberArgumentList(args, 2, variableInterpreter); - if(numbers.get(1) == null || numbers.get(1).equals(BigDecimal.ZERO)) + if(numbers.get(1) == null || numbers.get(1).compareTo(BigDecimal.ZERO) == 0) { return null; } @@ -194,7 +194,7 @@ public class FormulaInterpreter case "DIVIDE_SCALE": { List numbers = getNumberArgumentList(args, 3, variableInterpreter); - if(numbers.get(1) == null || numbers.get(1).equals(BigDecimal.ZERO)) + if(numbers.get(1) == null || numbers.get(1).compareTo(BigDecimal.ZERO) == 0) { return null; } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreterTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreterTest.java index 4c3fd574..df84fd13 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreterTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/FormulaInterpreterTest.java @@ -118,7 +118,14 @@ class FormulaInterpreterTest extends BaseTest assertEquals(new BigDecimal("34.500"), interpretFormula(vi, "MULTIPLY(100,0.345)")); assertThat((BigDecimal) interpretFormula(vi, "DIVIDE(1,2)")).isCloseTo(new BigDecimal("0.5"), ZERO_OFFSET); + assertThat((BigDecimal) interpretFormula(vi, "DIVIDE_SCALE(1,2,0)")).isEqualTo(new BigDecimal("1")); + assertThat((BigDecimal) interpretFormula(vi, "DIVIDE_SCALE(1,2,0)")).isEqualTo(new BigDecimal("1")); + assertThat((BigDecimal) interpretFormula(vi, "DIVIDE_SCALE(1,2,3)")).isEqualTo(new BigDecimal("0.500")); + assertThat((BigDecimal) interpretFormula(vi, "DIVIDE_SCALE(1,2,4)")).isEqualTo(new BigDecimal("0.5000")); assertNull(interpretFormula(vi, "DIVIDE(1,0)")); + assertNull(interpretFormula(vi, "DIVIDE(1,0.0)")); + assertNull(interpretFormula(vi, "DIVIDE_SCALE(1,0,0)")); + assertNull(interpretFormula(vi, "DIVIDE_SCALE(1,0.0,1)")); assertEquals(new BigDecimal("0.5"), interpretFormula(vi, "ROUND(0.510,1)")); assertEquals(new BigDecimal("5.0"), interpretFormula(vi, "ROUND(5.010,2)"));