Возникли проблемы с поиском проблемы в цикле for - PullRequest
0 голосов
/ 29 октября 2018

Я пишу программу, в которой пользователь вводит имена участников и покупает их, как билет на конкурс. Я пытаюсь выяснить процентный шанс для каждого участника выиграть, но по какой-то причине он возвращает ноль, вот код

for(int i = 0; i < ticPurch.size(); i++){
    totalTics = ticPurch[i] + totalTics;                                              //Figuring out total amount of ticket bought
}
    cout << totalTics;

for (int i = 0; i < names.size(); i++){
    cout << "Contenstant "  << "   Chance of winning " << endl; 
    cout << names[i] << "   " << ((ticPurch.at(i))/(totalTics)) * 100 << " % " << endl; //Figuring out the total chance of winning 

}
    ticPurch is a vector of the the tickets each contestant bought and names is a vector for the contestants name. For some reason the percent is always returning zero and I don't know why

 return 0;

1 Ответ

0 голосов
/ 29 октября 2018

Деление целого числа на целое число дает целое число путем усечения дробной части.

Поскольку ваши значения меньше единицы, ваш результат всегда будет равен нулю.

Вы можете привести операнд к типу с плавающей запятой, чтобы получить вычисление, которое вы хотели:

(ticPurch.at(i) / (double)totalTics) * 100

Тогда, вероятно, округлите этот результат, так как вы, кажется, хотите получить целые числа:

std::floor((ticPurch.at(i) / (double)totalTics) * 100)

Мой предпочтительный подход, который полностью избегает с плавающей точкой (всегда приятно!), Заключается в умножении до разрешения вашего вычисления first :

(ticPurch.at(i) * 100) / totalTics

Это всегда будет округлять вниз , поэтому имейте в виду, что если вы решили использовать, скажем, std::round (или std::ceil) вместо std::floor в примере выше. Арифметические трюки могут имитировать их, если это необходимо.

Теперь, например, вместо (3/5) * 100 (то есть 0*100 (то есть 0)), например, у вас есть (3*100)/5 (то есть 300/5 (то есть 60)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...