C ++:我的累加器出了点问题

时间:2014-07-18 15:29:52

标签: c++ types casting accumulator accumulate

我一直在运行此代码,但我无法获得双倍数字的累积。

#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 ,然后输出了小数部分,所以至少我知道累加器有问题。我尝试将操作数的几个部分转换为加倍,但它没有工作。

2 个答案:

答案 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);