2011-10-19 94 views
0

我不明白为什么我的部门的结果出现向下舍入?为什么我的分部结果显示为关闭?

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int rVote, oVote, dVote; 
int rTotal, oTotal, dTotal, total; 
int rPercent, dPercent, oPercent; 

bool loop(char vote){ 
     switch(toupper(vote)){ 
       case 'D': 
        dVote = 1; 
        dTotal = dTotal + dVote; 
        return true; 
       case 'R': 
        rVote = 1; 
        rTotal = rTotal + rVote; 
        return true; 
       case 'O': 
        oVote = 1; 
        oTotal = oTotal + oVote; 
        return true; 
       case 'Q': 
        return false; 
     } 
     return true; 
} 
int main(){ 
     char vote; 
     do{ 
       printf("Enter Vote [D/R/O] or Q to quit: "); 
       scanf("%c%*c", &vote); 
     } while (loop(vote)); 
     total = dTotal + rTotal + oTotal; 
     rPercent = ((rTotal/total)*100); 
     dPercent = ((dTotal/total)*100); 
     oPercent = ((oTotal/total)*100); 
     printf("Democrate total vote %d: %d%%\n", dTotal, dPercent); 

     printf("Republican total vote %d: %d%%\n", rTotal, rPercent); 

     printf("Other total vote %d: %d%%\n", oTotal, oPercent); 
} 

大,我是非常愚蠢的.... 为什么说任何不打印在这个C/C++程序的百分比值我*Percent的吗?

谢谢。

+2

这是做到这一点:也许因为它四舍五入为最接近%这样的事情可能更合适一个不是C/C++程序。这是一个唯一的C++程序,因为它不会编译为C.但是,它被编写为一个C程序。你应该选择其中的一个并且学习它,而不是学习两者之间的某种混合。尽管出现,他们是非常不同的语言。如果你决定使用C++,我会推荐[一本好的C++入门书](http://stackoverflow.com/q/388242/46642)。 –

+0

我想成为一名C程序员,首先选择C语言,但在C++编程类atm中。老师似乎并不介意。所以主要是为什么我说我所有的代码都是用c格式写的。 –

回答

4

这是因为你在做整数除法。 C/C++中的整数划分向下舍入。所以,你的下面的代码:

rPercent = ((rTotal/total)*100); 
    dPercent = ((dTotal/total)*100); 
    oPercent = ((oTotal/total)*100); 

都是四舍五入至0

为了解决这个问题,你应该转换为浮点类型:

rPercent = (int)((double)rTotal/total*100); 
    dPercent = (int)((double)dTotal/total*100); 
    oPercent = (int)((double)oTotal/total*100); 

编辑:

由于四舍五入行为,上面的代码可能会给出一些奇怪的结果。

rPercent = (int)((double)rTotal/total*100 + 0.5); 
    dPercent = (int)((double)dTotal/total*100 + 0.5); 
    oPercent = (int)((double)oTotal/total*100 + 0.5); 
+0

有趣。谢谢。我不知道你可以这样写。等10分钟等待结束后,我会回答这个问题。很高兴我问了这个问题,我更喜欢这个修复,然后我记得前一阵子我做了些什么。 –

+0

转化为double虽然是矫枉过正....如果你只是乘以100,那么你不必前后来回投掷 –

+0

这里不是严格需要使用浮点数学,你只是想减少价值(除)在计算结束而不是开始。 –

1

,因为你是第一次归零他们:)

每个百分比

dPercent = ((dTotal*100)/total); 
相关问题