百分比计算

本文关键字:计算 百分比 | 更新日期: 2023-09-27 18:14:34

我想在C#(或在一些伪代码)中模拟Excel等效的PERCENTILE函数。我该怎么做呢?该函数应该接受两个参数,其中第一个是一个值列表,第二个是函数应该计算的百分位数。

坦克!

编辑:我很抱歉,如果我的问题看起来像我没有尝试过我自己。我只是不明白excel函数是如何工作的(是的,我先尝试了维基百科和wolfram),我想如果有人用代码来展示,我会更好地理解它。@CodeInChaos给出的答案似乎就是我想要的。

百分比计算

我认为维基百科页面有公式,你需要编写自己的函数…
我试过了:

public double Percentile(double[] sequence, double excelPercentile)
{
    Array.Sort(sequence);
    int N = sequence.Length;
    double n = (N - 1) * excelPercentile + 1;
    // Another method: double n = (N + 1) * excelPercentile;
    if (n == 1d) return sequence[0];
    else if (n == N) return sequence[N - 1];
    else
    {
         int k = (int)n;
         double d = n - k;
         return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
    }
}

编辑后的CodeInChaos注释:
Excel使用0到1之间的百分位数值(所以我改变了我的代码来实现这与维基百科公式)和另一种方法来计算n(所以我改变了注释的一个)。

尝试在:http://www.techonthenet.com/excel/formulas/percentile.php复制结果,我想到:

public static double Percentile(IEnumerable<double> seq,double percentile)
{
    var elements=seq.ToArray();
    Array.Sort(elements);
    double realIndex=percentile*(elements.Length-1);
    int index=(int)realIndex;
    double frac=realIndex-index;
    if(index+1<elements.Length)
        return elements[index]*(1-frac)+elements[index+1]*frac;
    else
        return elements[index];
}

(不处理NaN和无穷大)。

几个测试用例:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9

将值添加到列表中,对该列表进行排序,并获取索引值ceil(列表长度*百分位数)