根据 C++ 中的小数余数对平均值进行舍入

Round an average based on decimal remainder in C++

本文关键字:平均值 舍入 余数 C++ 小数 根据      更新时间:2023-10-16

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

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

 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 的余数始终为零,因此您的方法(字面上)一无所获。

你已经把所有东西都带走了,这就是为什么它不存储小数部分的原因。avstay 变量将始终给出 0,因此,它始终显示它的下限。

使用双倍而不是长整型;

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>