将除字符串之外的任何内容附加到std :: stringstream返回0

时间:2014-03-23 20:39:47

标签: c++ stringstream integer-division

有问题的代码:

        std::stringstream cd;
        int f = int((15 / allyCounter) * 100);
        cd << f;

allyCounter等于45.想法是获得allyCounter的15%,其中allyCounter是一个不断变化的动态int。我没有多少c ++经验,所以我确定我所缺少的是一些基本的东西。

3 个答案:

答案 0 :(得分:2)

这里的问题几乎可以肯定是整数与浮点数学。

15/45(在整数运算中完成时)为0。

尝试

    std::stringstream cd;
    int f = int((15.0 / allyCounter) * 100);
    cd << f;

......看看事情是不是更好。 15.0是一个双精度浮点常数,所以它会强制数学以浮点而不是整数来完成,所以你得到一个百分比。

另一种可能性是在分裂之前进行乘法运算:

int f = 1500 / allyCounter;

如果分子是变量,这可能会导致分子溢出的问题,但在这种情况下,我们知道它是一个不能溢出的值。

答案 1 :(得分:0)

在C ++中,15 / 450。 (它被称为“整数除法”:在C ++中划分两个int的结果也是int,因此真正的答案被截断,而15 / 450 。)

如果这是你的问题,那么在进行除法之前,只需将其加倍:

int f = static_cast<double>(15) / allyCounter * 100;

甚至:

int f = 15. / allyCounter * 100;

.中的15.会导致它成为双倍。)

答案 2 :(得分:0)

您正在使用整数除法:

std::stringstream cd;
int f = int((15.0 / allyCounter) * 100);
cd << f;

编译器看到15/allyCounter并认为它应该返回一个整数(你传递了两个整数,对吧?)。 15/150 == 0整数除法,你总是四舍五入。在这种情况下,编译器将15.0视为double,并使用小数位。