【问题标题】:Round an average based on decimal remainder in C++在 C++ 中基于小数余数舍入平均值
【发布时间】:2016-03-14 05:04:39
【问题描述】:

我需要从数组中找出平均值的余数,以便正确向上或向下舍入。基本上,如果数组的平均值有一个大于等于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 保存为long。尝试改用double
  • 你的 avremain 是长变量,它是 int。你不能得到小数部分。使用浮点变量并尝试找出如何获得小数部分。

标签: c++ arrays rounding average


【解决方案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 进行调整,而不是尝试调整平均值(在这种情况下,舍入趋向于零,并且余数信息丢失)。

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

顺便说一句:在您的代码中,表达式.....avremain=average%long(1.0)long(1.0) 等于1。将任何正整数除以1 的余数始终为零,因此您的方法(字面上)什么也没有。

【讨论】:

    【解决方案2】:

    您已将所有内容都延长了,这就是它不存储小数部分的原因。 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 &lt;cmath&gt;

    【讨论】:

    • 它允许我将 avremain 声明为双精度,但它要求我将 (1.0) 声明为非双精度,因为显然双精度和长声明不适用于模数等二元运算符。
    • 是的。模数不适用于双打。使用我在代码中提到的方式。
    • 确实如此!我导入了数学库并使用了 floor 函数,它运行良好!非常感谢您的所有帮助!
    • 没问题! :) 乐于助人!
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多