我一直在运行此代码,但我无法获得双倍数字的累积。
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main(){
vector<double> student_marks;
size_t num_students;
cout<<"Number of students:";
cin>>num_students;
student_marks.resize(num_students);
for(size_t i=0;i<student_marks.size();i++){
cout<<"Enter mark of student #"<<i+1<<":";
cin>>student_marks[i];
}
double sum_mark = accumulate(student_marks.begin(), student_marks.end(), 0);
cout<<"Total mark:"<<sum_mark<<endl
<<"Average mark:"<<sum_mark/student_marks.size()<<endl;
return 0;
}
以下是I / O的示例:
Number of students:3
Enter mark of student #1:1.8
Enter mark of student #2:2.3
Enter mark of student #3:3.4
Total mark:6
Average mark:2
此处的总标记应为7.5,但编译器完全忽略小数部分,并且仅使用整数部分计算,就像我将数字作为整数输入一样。 我认为累积基本上支持任何类型的数字,但似乎我无法告诉它将数字累加为双倍。我在一个元素上运行了一个 cout ,然后输出了小数部分,所以至少我知道累加器有问题。我尝试将操作数的几个部分转换为加倍,但它没有工作。
答案 0 :(得分:2)
accumulate
从初始值参数推导出它的累加器类型。尝试:
double sum_mark = accumulate(student_marks.begin(), student_marks.end(), 0.0);
^^^
答案 1 :(得分:1)
accumulate(student_marks.begin(), student_marks.end(), 0);
因为您传入了整数0
,所以模板使用类型int
进行实例化,导致所有枚举的双精度数被截断为整数。您需要传递double
作为初始值。作为旁注,请打开所有编译器警告。你的编译器应该警告你这个截断。
accumulate(student_marks.begin(), student_marks.end(), 0.0);