百分位算法

时间:2013-11-05 14:33:39

标签: c#

我正在编写一个找到百分位数的程序。根据eHow:

  

开始计算你的考试分数的百分位数(例如我们坚持你的分数为87)。使用的公式是L / N(100)= P其中L是分数小于87的测试次数,N是测试分数的总数(这里是150),P是百分位数。计算小于87的测试分数总数。我们假设数字为113.这使我们得到L = 113和N = 150。

所以,根据指示,我写道:

        string[] n = Interaction.InputBox("Enter the data set. The numbers do not have to  be sorted.").Split(',');
        List<Single> x = new List<Single> { };
        foreach (string i in n)
        {
            x.Add(Single.Parse(i));
        }
        x.Sort();
        List<double> lowerThan = new List<double> { };
        Single score = Single.Parse(Interaction.InputBox("Enter the number."));
        uint length = (uint)x.Count;
        foreach (Single index in x)
        {
            if (index > score)
            {
                lowerThan.Add(index);
            }
        }
        uint lowerThanCount = (uint)lowerThan.Count();

        double percentile = lowerThanCount / length * 100;
        MessageBox.Show("" + percentile);

然而程序总是以百分位数的形式返回0!我犯了什么错误?

5 个答案:

答案 0 :(得分:4)

您的计算

double percentile = lowerThanCount / length * 100;

全部以整数完成,因为右侧包含所有整数。至少其中一个操作数应该是浮点类型。所以

double percentile = (float) lowerThanCount / length * 100;

答案 1 :(得分:2)

问题在于您用于变量的类型:在此表达式中

double percentile = lowerThanCount / length * 100;
//                  ^^^^^^^^^^^^^^^^^^^^^^^
//                           |  |  |
// This is integer division; since length > lowerThanCount, its result is zero

除法在整数上完成,因此结果将为零。

lowerThanCount的类型更改为double以解决此问题:

double lowerThanCount = (double)lowerThan.Count();

答案 2 :(得分:2)

这实际上是一个舍入问题,lowerThanCount / length都是unit因此不支持小数位,因此任何自然百分比计算(例如0.2 / {{ 1}})会产生0.5

例如,如果我们假设0lowerThanCount = 10,则总和看起来像

length = 20

因此导致

double result = (10 / 20) * 100

由于(10 / 20) = 0.5 * 100 无法表示为整数,因此浮点会被截断,从而使0.5离开,因此最终的计算最终会变为

0

您可以通过强制计算使用浮点类型来解决此问题,例如

0 * 100 = 0;

就可读性而言,在给定double percentile = (double)lowerThanCount / length * 100 &amp;的计算中使用演员表可能更有意义。 lowerThanCount自然不会是浮点数。


此外,使用LINQ

可以简化您的代码
length

答案 3 :(得分:1)

您正在使用integer division而不是浮点除法。在分割之前将length / lowerThanCount投射到浮动。

答案 4 :(得分:1)

除了百分位计算(应该使用浮点数),我认为你的计数在这里:

foreach (Single index in x)
    {
        if (index > score)
        {
            lowerThan.Add(index);
        }
    }

您浏览索引,如果它们更大而不是得分,则将它们放入 lowerThan 只是一个逻辑错误?

编辑:对于百分位问题,这是我的修复:

 double percentile = ((double)lowerThanCount / (double)length) * 100.0;

你可能不需要那里的所有(双),但为了安全......