Процентный расчет в моей функции не работает

Итак, что я пытаюсь сделать, это взять вектор чисел, найти количество раз, когда каждый элемент встречается, а затем вычислить процентный эквивалент его количества вхождений в векторе.

он отлично работает с вектором с несколькими элементами только одного числа, но совсем не с вектором из разных элементов (точнее, 2), встречающихся несколько раз.

вот подробный вывод:

count = 6
pushed back 21
total = 6
percent = 6 / 6* 100
pushed back 100
Number:
21 
Percent Chance
100 

count = 5
pushed back 42
count = 5
pushed back 21
total = 5
total = 10
percent = 5 / 10* 100
pushed back 0
percent = 5 / 10* 100
pushed back 0
Number:
42 
Percent Chance
0 // SHOULD BE 50
Number:
21 
Percent Chance
0 // SHOULD BE 50

Вот код: (вывод из этой функции, запущенной дважды с другим вектором x)

 std::vector <std::string>  findpercentages(std::vector <std::string> x)
 {
 int count{};                          //for amount of times element occurs
 std::vector <std::string> tempvec{};  //to hold the element/s
 std::vector <int> counts{};           //to hold count for each element in tempvec
 std::vector <std::string> finalvec{}; //elements and counts of elements
 for (size_t i = 0; i < x.size(); i++)
 {
    //look for x[element] in tempvec, if not in tempvec, count occurances in x and add element to 
    // tempvec, add count to counts 
    std::vector <std::string>::iterator point { std::find(tempvec.begin(), tempvec.end(), x[i]) };
    if (point == tempvec.end())
    {
        count = std::count(x.begin(), x.end(), x[i]);
        std::cout << "count = " << count << '\n';
        counts.push_back(count);
        std::cout << "pushed back " << x[i] << '\n';
        tempvec.push_back(x[i]);

    }
}
int total{};
for (size_t n = 0; n < counts.size(); n++)
{
    total += counts[n]; //total for percentage calculation
    std::cout << "total = " << total << '\n';
}
for (size_t y = 0; y < tempvec.size(); y++)
{
    finalvec.push_back(tempvec[y]);
    //percent calculation. used unsigned_int64 because got arithmatic overflow warning if i just use 
    // int
    unsigned __int64 percentage = static_cast <unsigned __int64> (round((counts[y] / total) * 100));
    std::cout << "percent = " << counts[y] << " / " << total << "* 100" << '\n';
    finalvec.push_back(std::to_string(percentage));
    std::cout << "pushed back " << percentage << '\n';
}
return finalvec;
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
254
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
unsigned __int64 percentage = static_cast <unsigned __int64> (round((counts[y] / total) * 100));

должно быть что-то вроде

double percentage = round((100.0 * counts[y]) / total);

Ваша проблема в том, что когда вы делите одно целое число на другое, вы всегда получаете целое число. Так что (counts[y] / total) всегда будет 0 или 1.

Поэтому самое простое решение — ввести в расчет значение double100.0. Это гарантирует, что вы получите деление с плавающей запятой вместо целочисленного деления.

Я пробовал это раньше, но не в таком точном порядке. я сделаю это в таком порядке и отпишусь о результатах :)

Yugenswitch 17.12.2020 09:44

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

Yugenswitch 17.12.2020 09:46

Другие вопросы по теме