C++ 我的函数中的百分比计算不起作用

C++ 我的函数中的百分比计算不起作用,c++,math,vector,percentage,C++,Math,Vector,Percentage,所以我要做的是取一个数字向量,求出每个元素出现的时间,然后计算出向量中它的出现次数的百分比 它可以很好地处理只有一个数的几个元素的向量,但对于多次出现的不同元素(确切地说是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

所以我要做的是取一个数字向量,求出每个元素出现的时间,然后计算出向量中它的出现次数的百分比

它可以很好地处理只有一个数的几个元素的向量,但对于多次出现的不同元素(确切地说是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 FindPercentage(std::vector x)
{
int count{};//表示元素发生的次数
std::vector tempvec{};//用于保存元素
std::vector counts{};//保存tempvec中每个元素的计数
std::vector finalvec{};//元素和元素计数
对于(size_t i=0;i(counts[y]/total)
总是
0
1

因此,最简单的解决方案是在计算中引入一个
double
100.0
,这样可以确保得到的是浮点除法而不是整数除法

你的问题是当你用一个整数除以另一个整数时,你总是得到一个整数。所以
(counts[y]/total)
总是
0
1


因此,最简单的解决方案是在计算中引入一个
double
100.0
。这可以确保你得到的是浮点除法而不是整数除法。

我以前试过,但不是按那个确切的顺序。我会按那个顺序做,并回复结果:)它起作用了。我总是很高兴我能制作专业版格雷斯和写更好的代码,直到这样的事情发生,我不明白为什么我没有这样做。谢谢你,非常感谢我以前试过,但不是按照那个确切的顺序。我会按照那个顺序做,并回答结果:)它起作用了。我一直很高兴我取得了进步,写了更好的代码,直到今天这种事情发生了,我不明白为什么我没有这么做。谢谢你,非常感谢
 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;
}
unsigned __int64 percentage = static_cast <unsigned __int64> (round((counts[y] / total) * 100));
double percentage = round((100.0 * counts[y]) / total);