根据 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 个值以形成数组,我知道这没有问题,因为代码的早期部分运行良好。
没有必要向上或向下舍入,因为您正在使用整型完成所有工作。
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>
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 避免将 Int 转换为双重类型转换舍入
- 浮点数学运算后舍入不一致
- 浮动到绳子而无需舍入
- C++长双精度格式而不舍入
- 根据 C++ 中的小数余数对平均值进行舍入
- 用两个小数求3个数字的平均值(不舍入!)