std::cin >> setprecision(n) 有什么用?

Whats the use of std::cin >> setprecision(n)?

提问人:463035818_is_not_an_ai 提问时间:3/17/2023 最后编辑:463035818_is_not_an_ai 更新时间:3/17/2023 访问量:190

问:

cppreference 说道:

在表达式 或 中使用时,将流的精度参数 或 精确地设置为 。out << setprecision(n)in >> setprecision(n)outinn

同一页面底部的示例演示了 的用法。std::cout

同样对于输入流,该页面解释说,这实际上与调用调用 的函数相同。但是为了什么呢?有什么作用?str >> setprecision(n)str.precision(n)std::cin >> setprecision(n)

此代码

#include <iostream>
#include <iomanip>

int main() {
    double d;
    std::cin >> std::setprecision(1) >> d;
    std::cout << d << "\n";
    std::cin >> std::fixed >> std::setprecision(2) >> d;    
    std::cout << d << "\n";
}

使用此输入:

3.12
5.1234

生成以下输出

3.12
5.1234

所以看起来它根本没有效果。阅读有关 std::ios_base::p recision 的信息,似乎精度只对流有意义:

管理由 执行的浮点输出的精度(即生成了多少位数)。std::num_put::do_put

当根据 cpppreference 有效地调用仅影响输出时,可以传递的原因是什么?std::setprecisionstd::istream::operator>>str.precision(n)

C++ IOstream iomanip

评论

0赞 Richard Critten 3/17/2023
让代码针对这种情况进行编译可能比尝试修复它更容易,以便流修饰符成为例外。std::setprecision
0赞 463035818_is_not_an_ai 3/17/2023
@RichardCritten这是我最初的想法之一,但只要再想一想,我才真正理解;)。iomanips 只是函数,所有 manip 只有一个过载......>>

答:

4赞 user17732522 3/17/2023 #1

使用 with on a 或 on a 具有完全相同的效果,仅影响如何处理流上的输出。precision 属性存储在虚拟基类中,该基类在输入和输出流之间是统一的,这就是为什么它仍然可以在输入流上工作的原因。setprecision<<std::basic_ostream>>std::basic_istreamstd::ios_base

但是在纯输入流上,我没有看到它的任何应用。但是,在双向流上,这允许同时使用两者或设置输出精度。<<>>

我不清楚允许是否有特定的好处。这最初不在第一个C++标准草案中,而是与CD投票注释一起添加到C++98中,请参阅N1064中的注释CD2-27-015。不幸的是,该评论没有给出理由。setprecision>>