我正在编写一个找到百分位数的程序。根据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!我犯了什么错误?
答案 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
。
例如,如果我们假设0
和lowerThanCount = 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;
你可能不需要那里的所有(双),但为了安全......