我需要在平均值中显示两位小数。现在,它舍入到最接近的数字,并且当计算量为十分之一和百分之一时,显示零。我可能会忽略一些非常简单的事情。我认为将类型声明为double将允许它显示正确的计算。
double CalculateAverageScore(int score[],int numPlayers, double averageScore)
{
double total = 0;
for (int i = 0; i < numPlayers; i++)
{
total += score[i];
}
averageScore = total / numPlayers;
cout << fixed << showpoint << setprecision(2);
cout << "\nAverage Score: " << averageScore << endl;
return averageScore;
}
答案 0 :(得分:5)
averageScore = total / numPlayers;
^^^
integer division
为了保持双精度:
averageScore = static_cast< double>( total) / numPlayers;
^^^
explicit cast
但是,如果您将double
除以int
结果,则应该已经是double
,并且不需要演员。
既然你已经解释过你有兴趣现在就听听最佳实践,在编程曲线的舞台上 - 你应该真正改变功能
double CalculateAverageScore(int score[],int numPlayers)
{
//...
double averageScore = total / numPlayers;
return averageScore;
}
因为您之前已将averageScore
作为参数但未使用它的初始值:
double CalculateAverageScore(int score[],int numPlayers, double averageScore)
{
double total = 0.0;
//...
averageScore = total / numPlayers;
^
forget initial value, so it was useless
== no need to pass averageScore as argument
//....
}
答案 1 :(得分:1)
根据您的示例,您的解决方案应该按原样运行。
double total = 0;
// ...
averageScore = total / numPlayers; // Result of division is of type double.
您要将double
除以int
,结果应为double
。因此不需要演员表。
其他一些问题:
score
声明为int*
,允许客户端传递空值(并且您不会检查此值)。numPlayers
声明为int
这是不好的做法,而是声明为std::size_t
。averageScore
被声明为参数但从不使用参数。而是将其声明为局部变量。const
。请考虑使用模板参数将score
作为对int[N]
的引用。然后,您不必将数组长度作为第二个参数传递。 E.g:
template <const std::size_t N>
double average(const int (&score)[N]) {
return static_cast<double>(std::accumulate(std::begin(score), std::end(score), 0)) / N;
}
并用作:
int score[5] = { 2, 2, 3, 4, 5};
std::cout << std::fixed << std::showpoint << std::setprecision(2);
std::cout << average(score) << std::endl; // Outputs 3.20
或者使用标准库中的容器而不是score
的内置数组,例如std::array