在 C++ 中根据小数余数舍入平均值
Round an average based on decimal remainder in C++
我需要找到从数组中取出的平均值的余数,以便我可以正确地向上或向下舍入。基本上,如果数组的平均值有一个小数点大于等于0.5,我就需要向上取整,否则就需要向下取整。
long arrayaverage;
long average;
long avremain;
long output;
average = ((array1[0]+array1[1]+array1[2]+array1[3]+array1[4])/5);
avremain=average%long(1.0);
if (avremain>=0.5)
{
output=((average-avremain)+1);
}
else if (avremain<0.5)
{
output=(average-avremain);
}
cout<<"The average of the array is: "<<output<<endl;
这是我的代码,但我认为问题出在模运算符上。每当我尝试 运行 我的代码时,我都会得到平均值,但它总是四舍五入。任何帮助将不胜感激!
(旁注:在代码的较早部分中,从用户那里收集了 5 个值以形成数组,我知道这没有问题,因为代码的较早部分 运行很好。)
你把所有的东西都花得太久了,这就是它不存储小数部分的原因。 avremain 变量将始终给出 0,因此它始终显示它的底部。
使用 double 而不是 long;
double arrayaverage;
double average;
double avremain;
double output;
average = ((array1[0]+array1[1]+array1[2]+array1[3]+array1[4])/5);
avremain=average - floor(average);
if (avremain>=0.5)
{
output=((average-avremain)+1);
}
else if (avremain<0.5)
{
output=(average-avremain);
}
cout<<"The average of the array is: "<<output<<endl;
要使用 floor,写 #include <cmath>
没有必要向上或向下舍入,因为您正在使用整型进行所有工作。
long sum = array1[0]+array1[1]+array1[2]+array1[3]+array1[4];
long remainder = sum % 5L; // 5L for consistency working with longs
if (2*remainder > 5L) // this will effectively round up
sum += 5L;
sum -= remainder; // sum will be a multiple of 5 now
average = sum/5L;
我所做的只是在除以数字之前对 sum
进行调整,而不是尝试调整平均值(在这种情况下,四舍五入趋向于零,余数信息丢失) .
我假设总和为正,因此平均值为正。底片的调整是微不足道的,我会把它留作练习。
顺便说一句:在您的代码中,表达式 ..... avremain=average%long(1.0)
、long(1.0)
等于 1
。将任何正整数除以 1
的余数始终为零,因此您的方法(字面上)没有实现。
我需要找到从数组中取出的平均值的余数,以便我可以正确地向上或向下舍入。基本上,如果数组的平均值有一个小数点大于等于0.5,我就需要向上取整,否则就需要向下取整。
long arrayaverage;
long average;
long avremain;
long output;
average = ((array1[0]+array1[1]+array1[2]+array1[3]+array1[4])/5);
avremain=average%long(1.0);
if (avremain>=0.5)
{
output=((average-avremain)+1);
}
else if (avremain<0.5)
{
output=(average-avremain);
}
cout<<"The average of the array is: "<<output<<endl;
这是我的代码,但我认为问题出在模运算符上。每当我尝试 运行 我的代码时,我都会得到平均值,但它总是四舍五入。任何帮助将不胜感激!
(旁注:在代码的较早部分中,从用户那里收集了 5 个值以形成数组,我知道这没有问题,因为代码的较早部分 运行很好。)
你把所有的东西都花得太久了,这就是它不存储小数部分的原因。 avremain 变量将始终给出 0,因此它始终显示它的底部。
使用 double 而不是 long;
double arrayaverage;
double average;
double avremain;
double output;
average = ((array1[0]+array1[1]+array1[2]+array1[3]+array1[4])/5);
avremain=average - floor(average);
if (avremain>=0.5)
{
output=((average-avremain)+1);
}
else if (avremain<0.5)
{
output=(average-avremain);
}
cout<<"The average of the array is: "<<output<<endl;
要使用 floor,写 #include <cmath>
没有必要向上或向下舍入,因为您正在使用整型进行所有工作。
long sum = array1[0]+array1[1]+array1[2]+array1[3]+array1[4];
long remainder = sum % 5L; // 5L for consistency working with longs
if (2*remainder > 5L) // this will effectively round up
sum += 5L;
sum -= remainder; // sum will be a multiple of 5 now
average = sum/5L;
我所做的只是在除以数字之前对 sum
进行调整,而不是尝试调整平均值(在这种情况下,四舍五入趋向于零,余数信息丢失) .
我假设总和为正,因此平均值为正。底片的调整是微不足道的,我会把它留作练习。
顺便说一句:在您的代码中,表达式 ..... avremain=average%long(1.0)
、long(1.0)
等于 1
。将任何正整数除以 1
的余数始终为零,因此您的方法(字面上)没有实现。