Код в вопросе:
std::stringstream cd;
int f = int((15 / allyCounter) * 100);
cd << f;
allyCounter равен 45. Идея состоит в том, чтобы получить процент 15 от allyCounter, где allyCounter — это динамический int, который постоянно меняется. У меня нет большого опыта работы с c ++, поэтому я уверен, что мне не хватает чего-то фундаментального.
Проблема здесь почти наверняка связана с математикой целых и чисел с плавающей точкой.
15/45 (когда сделано в целочисленной математике) равно 0.
Пытаться
std::stringstream cd;
int f = int((15.0 / allyCounter) * 100);
cd << f;
…и посмотрим, что будет лучше. 15.0 — это константа с плавающей запятой двойной точности, так что математика будет выполняться с плавающей запятой вместо целых чисел, так что вы получите процент.
Другой возможностью было бы сделать умножение перед делением:
int f = 1500 / allyCounter;
Если числитель был переменной, это может привести к проблеме из-за переполнения числителя, но в этом случае мы знаем, что это значение не может быть переполнено.
В C ++ 15 / 45
является 0
, (Это называется «целочисленное деление»: результат деления двух int
s в C ++ также int
и, следовательно, реальный ответ усекается, и 15 / 45
является 0
.)
Если это ваша проблема, просто сделайте ее двойной, прежде чем делить:
int f = static_cast<double>(15) / allyCounter * 100;
или даже:
int f = 15. / allyCounter * 100;
(The .
в 15.
заставляет это быть двойным.)
Вы используете целочисленное деление:
std::stringstream cd;
int f = int((15.0 / allyCounter) * 100);
cd << f;
Компилятор видит 15/allyCounter
и думает, что он должен вернуть целое число (вы передали ему два целых числа, верно?). 15/150 == 0
с целочисленным делением вы всегда округляетесь. В этом случае компилятор видит 15.0
как двойной, и использует десятичные разряды.