From: PJ Fanning Date: Mon, 23 May 2022 14:09:07 +0000 (+0000) Subject: partial implementation CEILING.MATH function (needs more testing and bad param support) X-Git-Tag: REL_5_2_3~311 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=445b01c04d375d7ca9658738757f0d3fd4c254bf;p=poi.git partial implementation CEILING.MATH function (needs more testing and bad param support) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901174 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java index 6c84abfea0..a5784c5f32 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java @@ -62,12 +62,14 @@ public final class CeilingMath implements FreeRefFunction { } if (roundNegativeNumsDown && xval < 0.0) { if (multiplier != 1.0) { - return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, RoundingMode.FLOOR)); + RoundingMode mode = multiplier < 0.0 ? RoundingMode.CEILING : RoundingMode.FLOOR; + return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode)); } return new NumberEval(Math.floor(xval)); } if (multiplier != 1.0) { - return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, RoundingMode.CEILING)); + RoundingMode mode = multiplier < 0.0 ? RoundingMode.FLOOR : RoundingMode.CEILING; + return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode)); } return new NumberEval(Math.ceil(xval)); } catch (EvaluationException evaluationException) { diff --git a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingMath.java b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingMath.java index 5780f58562..9eb744ccb6 100644 --- a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingMath.java +++ b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingMath.java @@ -47,6 +47,11 @@ final class TestCeilingMath { assertDouble(fe, cell, "CEILING.MATH(6.7)", 7.0, 0.00000000000001); assertDouble(fe, cell, "CEILING.MATH(-8.1,2)", -8.0, 0.00000000000001); assertDouble(fe, cell, "CEILING.MATH(-5.5,2,-1)", -6.0, 0.00000000000001); + + assertDouble(fe, cell, "CEILING.MATH(2.5,-2)", 4.0, 0.00000000000001); + assertDouble(fe, cell, "CEILING.MATH(-2.5,-2)", -2.0, 0.00000000000001); + assertDouble(fe, cell, "CEILING.MATH(-2.5,-2,-1)", -4.0, 0.00000000000001); + assertDouble(fe, cell, "CEILING.MATH(0.234, 0.01)", 0.24, 0.00000000000001); } }