]> source.dussan.org Git - poi.git/commitdiff
[bug-49202] add PERCENTRANK.EXC function
authorPJ Fanning <fanningpj@apache.org>
Sat, 7 Aug 2021 18:36:12 +0000 (18:36 +0000)
committerPJ Fanning <fanningpj@apache.org>
Sat, 7 Aug 2021 18:36:12 +0000 (18:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1892088 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/ss/formula/atp/PercentRankExcFunction.java
poi/src/main/java/org/apache/poi/ss/formula/functions/PercentRank.java

index bc4d88724550f70d98b1bb994c9b6992c1217be4..8391666615704a837b5973e3a32ada07b37a64bb 100644 (file)
@@ -25,7 +25,6 @@ import org.apache.poi.ss.formula.functions.PercentRank;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -132,12 +131,8 @@ final class PercentRankExcFunction implements FreeRefFunction {
         }
         if (!recurse || closestMatchBelow == x || closestMatchAbove == x) {
             int lessThanCount = 0;
-            int greaterThanCount = 0;
-            int matchesCount = 0;
             for (Double d : numbers) {
                 if (d < x) lessThanCount++;
-                else if (d > x) greaterThanCount++;
-                else matchesCount++;
             }
             BigDecimal result = new BigDecimal((double)(lessThanCount + 1) / (double)(numbers.size() + 1));
             return new NumberEval(PercentRank.round(result, significance, RoundingMode.DOWN));
@@ -150,13 +145,8 @@ final class PercentRankExcFunction implements FreeRefFunction {
             if (!(aboveRank instanceof NumberEval)) {
                 return aboveRank;
             }
-            NumberEval below = (NumberEval)belowRank;
-            NumberEval above = (NumberEval)aboveRank;
-            double diff = closestMatchAbove - closestMatchBelow;
-            double pos = x - closestMatchBelow;
-            double rankDiff = above.getNumberValue() - below.getNumberValue();
-            BigDecimal result = new BigDecimal(below.getNumberValue() + (rankDiff * (pos / diff)));
-            return new NumberEval(PercentRank.round(result, significance, RoundingMode.HALF_UP));
+            return PercentRank.interpolate(x, closestMatchBelow, closestMatchAbove,
+                    (NumberEval)belowRank, (NumberEval)aboveRank, significance);
         }
     }
 }
index 0eecb75c07aeeddf0566b384cac535beae010927..10d67f7cc8c9a43b86464daf8f72b233df8e35c1 100644 (file)
@@ -133,16 +133,20 @@ public final class PercentRank implements Function {
             if (!(aboveRank instanceof NumberEval)) {
                 return aboveRank;
             }
-            NumberEval below = (NumberEval)belowRank;
-            NumberEval above = (NumberEval)aboveRank;
-            double diff = closestMatchAbove - closestMatchBelow;
-            double pos = x - closestMatchBelow;
-            double rankDiff = above.getNumberValue() - below.getNumberValue();
-            BigDecimal result = new BigDecimal(below.getNumberValue() + (rankDiff * (pos / diff)));
-            return new NumberEval(round(result, significance, RoundingMode.HALF_UP));
+            return interpolate(x, closestMatchBelow, closestMatchAbove, (NumberEval)belowRank, (NumberEval)aboveRank, significance);
         }
     }
 
+    @Internal
+    public static NumberEval interpolate(double x, double closestMatchBelow, double closestMatchAbove,
+                                         NumberEval belowRank, NumberEval aboveRank, int significance) {
+        double diff = closestMatchAbove - closestMatchBelow;
+        double pos = x - closestMatchBelow;
+        double rankDiff = aboveRank.getNumberValue() - belowRank.getNumberValue();
+        BigDecimal result = new BigDecimal(belowRank.getNumberValue() + (rankDiff * (pos / diff)));
+        return new NumberEval(round(result, significance, RoundingMode.HALF_UP));
+    }
+
     @Internal
     public static double round(BigDecimal bd, int significance, RoundingMode rounding) {
         //the rounding in https://support.microsoft.com/en-us/office/percentrank-function-f1b5836c-9619-4847-9fc9-080ec9024442