You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/05/28 18:42:33 UTC

svn commit: r1901367 - in /poi/trunk/poi/src: main/java/org/apache/poi/ss/formula/atp/ main/java/org/apache/poi/ss/formula/functions/ test/java/org/apache/poi/ss/formula/functions/

Author: fanningpj
Date: Sat May 28 18:42:32 2022
New Revision: 1901367

URL: http://svn.apache.org/viewvc?rev=1901367&view=rev
Log:
[bug-66097] support CEILING.PRECISE function

Added:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingPrecise.java
      - copied, changed from r1901195, poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingPrecise.java
      - copied, changed from r1901366, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java
Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1901367&r1=1901366&r2=1901367&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java Sat May 28 18:42:32 2022
@@ -80,6 +80,7 @@ public final class AnalysisToolPak imple
         r(m, "BIN2OCT", null);
         r(m, "COMPLEX", Complex.instance);
         r(m, "CEILING.MATH", CeilingMath.instance);
+        r(m, "CEILING.PRECISE", CeilingPrecise.instance);
         r(m, "CONCAT", TextFunction.CONCAT);
         r(m, "CONVERT", null);
         r(m, "COUNTIFS", Countifs.instance);

Copied: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingPrecise.java (from r1901195, poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java)
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingPrecise.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingPrecise.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java&r1=1901195&r2=1901367&rev=1901367&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingMath.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/CeilingPrecise.java Sat May 28 18:42:32 2022
@@ -29,16 +29,16 @@ import java.math.RoundingMode;
 import static org.apache.poi.ss.formula.functions.MathX.scaledRoundUsingBigDecimal;
 
 /**
- * Implementation for Excel CEILING.MATH() function.
+ * Implementation for Excel CEILING.PRECISE() function.
  * <ul>
- *   <li>https://support.microsoft.com/en-us/office/ceiling-math-function-80f95d2f-b499-4eee-9f16-f795a8e306c8</li>
+ *   <li>https://support.microsoft.com/en-us/office/ceiling-precise-function-f366a774-527a-4c92-ba49-af0a196e66cb</li>
  * </ul>
  */
-public final class CeilingMath implements FreeRefFunction {
+public final class CeilingPrecise implements FreeRefFunction {
 
-    public static final CeilingMath instance = new CeilingMath();
+    public static final CeilingPrecise instance = new CeilingPrecise();
 
-    private CeilingMath() {}
+    private CeilingPrecise() {}
 
     @Override
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {
@@ -53,23 +53,10 @@ public final class CeilingMath implement
             double multiplier = 1.0;
             if (args.length > 1) {
                 Double arg1Val = evaluateValue(args[1], ec.getRowIndex(), ec.getColumnIndex());
-                multiplier = arg1Val != null ? arg1Val.doubleValue() : 1.0;
-            }
-            boolean roundNegativeNumsDown = false;
-            if (args.length > 2) {
-                Double arg2Val = evaluateValue(args[2], ec.getRowIndex(), ec.getColumnIndex());
-                roundNegativeNumsDown = arg2Val != null && arg2Val.doubleValue() < 0.0;
-            }
-            if (roundNegativeNumsDown && xval < 0.0) {
-                if (multiplier != 1.0) {
-                    RoundingMode mode = multiplier < 0.0 ? RoundingMode.CEILING : RoundingMode.FLOOR;
-                    return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode));
-                }
-                return new NumberEval(Math.floor(xval));
+                multiplier = arg1Val != null ? Math.abs(arg1Val.doubleValue()) : 1.0;
             }
             if (multiplier != 1.0) {
-                RoundingMode mode = multiplier < 0.0 ? RoundingMode.FLOOR : RoundingMode.CEILING;
-                return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode));
+                return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, RoundingMode.CEILING));
             }
             return new NumberEval(Math.ceil(xval));
         } catch (EvaluationException evaluationException) {

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java?rev=1901367&r1=1901366&r2=1901367&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java Sat May 28 18:42:32 2022
@@ -56,8 +56,7 @@ public final class FloorPrecise implemen
                 multiplier = arg1Val != null ? Math.abs(arg1Val.doubleValue()) : 1.0;
             }
             if (multiplier != 1.0) {
-                RoundingMode mode = multiplier < 0.0 ? RoundingMode.CEILING : RoundingMode.FLOOR;
-                return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode));
+                return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, RoundingMode.FLOOR));
             }
             return new NumberEval(Math.floor(xval));
         } catch (EvaluationException evaluationException) {

Copied: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingPrecise.java (from r1901366, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java)
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingPrecise.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingPrecise.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java&r1=1901366&r2=1901367&rev=1901367&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestCeilingPrecise.java Sat May 28 18:42:32 2022
@@ -31,11 +31,11 @@ import static org.apache.poi.ss.util.Uti
 import static org.apache.poi.ss.util.Utils.assertError;
 
 /**
- * Tests for {@link FloorPrecise}
+ * Tests for {@link CeilingPrecise}
  */
-final class TestFloorPrecise {
+final class TestCeilingPrecise {
 
-    //https://support.microsoft.com/en-us/office/floor-precise-function-f769b468-1452-4617-8dc3-02f842a0702e
+    //https://support.microsoft.com/en-us/office/ceiling-precise-function-f366a774-527a-4c92-ba49-af0a196e66cb
     @Test
     void testMicrosoftExamples() throws IOException {
         try (HSSFWorkbook wb = new HSSFWorkbook()) {
@@ -43,11 +43,12 @@ final class TestFloorPrecise {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertDouble(fe, cell, "FLOOR.PRECISE(-3.2,-1)", -4, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.PRECISE(3.2,1)", 3, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.PRECISE(-3.2,1)", -4, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.PRECISE(3.2,-1)", 3, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.PRECISE(3.2)", 3, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(4.3)", 5, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(-4.3)", -4, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(4.3,2)", 6, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(4.3,-2)", 6, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(-4.3,2)", -4, 0.00000000000001);
+            assertDouble(fe, cell, "CEILING.PRECISE(-4.3,-2)", -4, 0.00000000000001);
         }
     }
 
@@ -58,7 +59,7 @@ final class TestFloorPrecise {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertError(fe, cell, "FLOOR.PRECISE()", FormulaError.VALUE);
+            assertError(fe, cell, "CEILING.PRECISE()", FormulaError.VALUE);
         }
     }
 
@@ -69,7 +70,7 @@ final class TestFloorPrecise {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertError(fe, cell, "FLOOR.PRECISE(\"abc\")", FormulaError.VALUE);
+            assertError(fe, cell, "CEILING.PRECISE(\"abc\")", FormulaError.VALUE);
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org