基于C ++中的十进制余数舍入平均值

时间:2016-03-14 05:04:39

标签: c++ arrays rounding average

我需要找到从数组中取出的平均值的余数,以便我可以正确地向上或向下舍入。基本上,如果数组的平均值小于或等于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个值以形成数组,我知道没有问题,因为代码的早期部分运行得很好。)

2 个答案:

答案 0 :(得分:1)

没有必要向上或向下舍入,因为你正在使用整数类型完成所有工作。

 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进行调整,而不是尝试调整平均值(在这种情况下,舍入为零,剩余信息丢失)。 / p>

我假设总和因此平均值是正数。对负面的调整是微不足道的,我将把它留作练习。

BTW:在您的代码中,表达式{avremain=average%long(1.0)long(1.0)等于1。将任何正整数除以1的余数始终为零,因此您的方法(字面上)无法实现。

答案 1 :(得分:0)

你已经把所有东西都拿走了,这就是它不存储小数部分的原因。 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;

要使用发言权,请写下#include <cmath>