C计算百分比#

问题描述:

我在尝试计算完成百分比时在这里丢失了什么?我的百分比方程似乎返回不正确的百分比。C计算百分比#

Int32 counter = 0; 

foreach (var vehicle in vehicles) 
{ 
    counter += 1; 

    Int32 percentage = (Int32)((double)counter * vehicles.Count())/100; 

    _worker.ReportProgress(percentage); 


    if (_worker.CancellationPending) 
    { 
     e.Cancel = true; 
     _worker.ReportProgress(0); 
     return; 
    } 
} 
+3

“我的个方程似乎返回不正确的百分比。”什么样的输入值给出了什么样的输出值,以及你期望的是什么?你可以将其重写为一个简短但完整的控制台应用程序吗? (这样做应该是微不足道的。) –

+1

你为什么用计数乘以计数而不是分数?我认为你有一个在你的公式有点倒退... – iMortalitySX

+0

iMortalitySX,你说得对。我稍微反了一点。 :) –

制定出百分比,你应该做的

progress 
-------- x 100 
total 

你正在做

progress x total 
---------------- 
     100 

尝试使用(counter * 100)/vehicles.Count()代替。

注意:如果你在分割之前乘以100,这意味着你不需要混淆转换为浮动/双打,但是这意味着你的所有百分比都向下舍入。如果你想要一个更精确的百分比,然后投掷双打,不要担心顺序。

+0

是的,它对我意识到这是正确的路线。我想我昨天晚上睡得不够。 :) –

+0

如果我有1,4,1,我试着用'Math.Round()'得到百分比,我最终得到17%,67%,17%,总计达到101%。我将如何解决这个问题? – Si8

怎么样

 Int32 percentage = counter * 100/vehicles.Count(); 
+4

+1,但不要忘记检查Count()!= 0(或车辆!=为null)。 – iMortalitySX

+3

,因为它在foreach循环内,如果循环内的代码被执行,Count始终> 0。 – user287107

+1

LOL,你是对的,我只是想说明一个普通的情况,你会检查它们。 – iMortalitySX

试试这个: -

int percentage= (int)(((100f * counter)/vehicles.count())); 

演员浮动,以避免整数除法给你一个零,并且可以为整数四舍五入0.5。使用0.5F不是0.5,以保持它扩大一倍,即

int percentage= (int)(0.5f + ((100f * counter)/vehicles.count())); 

您还可以使用Math.round():

Int32 percentage = (Int32)Math.Round((double)(counter * 100)/vehicles.Count()); 
+0

如果我有1,4,1,我试着用'Math.Round()'得到百分比,我最终得到17%,67%,17%,总计达到101%。我将如何解决这个问题? – Si8

+1

在您付款之前,您正在丢失信息;在进行总计之前,您必须具有更高的精度,否则您无法期望您的后续计算能够保持显着的正确性。例如在你的例子中,通过使用Math.Round(x,1)来保持一位小数将产生100.1的总和,其将舍入为100。 – Sogger