流大小 prec = cout.precision() 的意义何在;和以下行

What is the point of streamsize prec = cout.precision(); and the following lines?

本文关键字:prec cout precision      更新时间:2023-10-16
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using std::cin; using std::sort;
using std::cout; using std::streamsize;
using std::endl; using std::string;
using std::setprecision; using std::vector;
int main()
{
    cout << "Please enter your midterm and final exam grades: ";
    double midterm, final;
    cin >> midterm >> final;
    cout << "Enter all your homework grades, "
        "followed by end-of-file: ";
    vector<double> homework;
    double x;
    while (cin >> x)
        homework.push_back(x);
        int size = homework.size();
        if (size == 0) {
                    cout << endl << "You must enter your grades. "
                    "Please try again." << endl;
                    return 1;
                        }
    sort(homework.begin(), homework.end());
    int mid = size/2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2
            : homework[mid];
    streamsize prec = cout.precision();
    cout << "Your final grade is " << setprecision(3)
        << 0.2 * midterm + 0.4 * final + 0.4 * median
        << setprecision(prec) << endl;
return 0;
}

在这个例子中,"streamsize"的意义是什么,为什么cout.precision()是这样设置的?以下行有"setprecision(3)",然后在末尾再次设置precision(prec)。为什么?

streamsize prec = cout.precision();
cout << "Your final grade is " << setprecision(3)
    << 0.2 * midterm + 0.4 * final + 0.4 * median
    << setprecision(prec) << endl;

该代码将std::cout的精度重置为原始值,以便后续使用std::cout不使用三位精度。

我建议使用范围保护,这样即使setprecision(3)setprecision(prec)之间抛出异常,精度也会重置。

原因是作者希望设置他打印的值的精度,但为之后使用它的每个人保留流的现有精度。

使用 streamsize 的原因很简单:它是从 cout.precision() 返回的确切类型。