2011-10-10 167 views
3

我试图计算成功作业总数的百分比。 代码:C#简单数学函数

int total = valid + invalid; 
int percent = (valid/total) * 100; 
if (percent == 0) 
{ 
    MessageBox.Show(Convert.ToString(total) + ":" + Convert.ToString(valid)); 
    break; 
} 

如果所有的工作都成功,百分比是100%。 如果一个任务是坏的,百分比为0,我得到消息框有: 9:8

8/9 * 100 = 88.888,不是0

int percent = Convert.ToInt32((valid/total) * 100); 

没有给出结果。请帮帮我。 我是俄罗斯人,对不起英语感到抱歉。

+3

你正在做整数除法... – davin

回答

3

我猜测都validinvalid被定义为int秒。在这种情况下,所有计算的结果也将是int s。

你要么需要转换值中的一个浮点类型的操作或者,这可能会更容易,定义值中的一个作为浮点类型开始:

double total = valid + invalid; 
int percent = (valid/total) * 100; 
+0

值得注意的另一个选项(如果你想要的只是一个int),你可以改变计算顺序。 (有效* 100)/总数将起作用(当然,您必须注意,最终结果将是一个简单的整数,而不是通常预期的方式)。 – Chris

0

尝试:

float total = valid + invalid; 
float percent = (valid/total) * 100; 
if (percent == 0) 
{ 
    MessageBox.Show(Convert.ToString(total) + ":" + Convert.ToString(valid)); 
    break; 
} 

编辑:

变更%的浮动太大。

+0

原因是int除以另一个int总是给你一个int。如果你用float分隔一个int,你会得到一个浮点数。所以你的值四舍五入到最接近的整数(0或1),然后你乘以100. –

+0

你忘了一个int转换为int – harold

+0

上面不会给第二行编译器错误? (隐式地将'float'转换为'int') – James

3

你的有效和总变量是int,这意味着你的有效/总分数将被截断为一个整数,在你的情况下它总是为0。

如果您将其中一个变量更改为双精度型,它将允许分区执行您期望的方式。

int percent = Convert.ToInt32(((double)valid/total) * 100); 

现在,这会导致你的if语句不能正常工作了,所以你必须要改变,要察看一下,这不是100

所以不是

if (percent == 0) 

你想要做这样的事情

if (percent != 100) 

代替

0

在计算之前将您的整数转换为浮点数。

int percent = Math.Round(((float)valid/(float)total) * 100); 
0

你需要使用某种浮点数学而不是整数。

int total = valid + invalid; 
int percent = ((decimal)valid/(decimal)total) * 100m; 
0

的问题是,的(valid/total)结果为int(整数),如validtotalints,所以除法的结果将截断成整数。

解决方法是迫使一个是一个floatdoubledecimal

int percent = (int)Convert.ToInt32(((float)valid/total) * 100); 
0

您应该使用float而不是int

float percent = ((float)valid/(float)total) * 100.00f; 

编辑
是的,我忘了投vallidtotal浮动。

+0

在转换为浮点数以执行乘法操作之前,不会有与(int/valid)相同的问题。 –

+0

@GeorgeDuckett:是的,编辑 – IAbstract

0

你的其中一个因素需要是浮点值,否则你最终会得到一个整数。

int total = valid + invalid; 

int percent = (int)((valid/(float)total) * 100); 

if (percent == 0) 
{ 
    MessageBox.Show(Convert.ToString(total) + ":" + Convert.ToString(valid)); 
    break; 
} 
1

你只需要多与周围的浇铸,这样你没有做整数除法和寻找一个浮点结果,例如:

double percent = ((double)valid/total) * 100; 
1

让您的生产线是:

int percent = (int)(((float)valid/(float)total) * 100f); 
1

你的问题是你在integer(целоечисло)上运行,但为了让分区正常工作,你应该使用rational number

当你执行8/9时,你有0,因为八低于9,所以结果将在1和0之间。要表示1到0之间的数字,你必须使用浮点类型。

float total = valid + invalid; 

现在分工是这样的:

8/9.0 

但这仍然不是终点,如果分配的浮点数成整数,你将有一个编译器警告。

float result = (valid/total) * 100;