добавление в std :: stringstream всего, кроме строки, возвращает 0

Код в вопросе:

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

allyCounter равен 45. Идея состоит в том, чтобы получить процент 15 от allyCounter, где allyCounter — это динамический int, который постоянно меняется. У меня нет большого опыта работы с c ++, поэтому я уверен, что мне не хватает чего-то фундаментального.

0

Решение

Проблема здесь почти наверняка связана с математикой целых и чисел с плавающей точкой.

15/45 (когда сделано в целочисленной математике) равно 0.

Пытаться

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

…и посмотрим, что будет лучше. 15.0 — это константа с плавающей запятой двойной точности, так что математика будет выполняться с плавающей запятой вместо целых чисел, так что вы получите процент.

Другой возможностью было бы сделать умножение перед делением:

int f = 1500 / allyCounter;

Если числитель был переменной, это может привести к проблеме из-за переполнения числителя, но в этом случае мы знаем, что это значение не может быть переполнено.

2

Другие решения

В C ++ 15 / 45 является 0, (Это называется «целочисленное деление»: результат деления двух ints в C ++ также intи, следовательно, реальный ответ усекается, и 15 / 45 является 0.)

Если это ваша проблема, просто сделайте ее двойной, прежде чем делить:

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

или даже:

int f = 15. / allyCounter * 100;

(The . в 15. заставляет это быть двойным.)

0

Вы используете целочисленное деление:

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

Компилятор видит 15/allyCounter и думает, что он должен вернуть целое число (вы передали ему два целых числа, верно?). 15/150 == 0 с целочисленным делением вы всегда округляетесь. В этом случае компилятор видит 15.0 как двойной, и использует десятичные разряды.

0
По вопросам рекламы [email protected]