2017-07-13 117 views
2

如教程中所示http://www.cplusplus.com/reference/iomanip/setprecision/** std :: setprecision()**没有** std :: fixed **在C++中的作用是什么?

// setprecision example 
#include <iostream>  // std::cout, std::fixed 
#include <iomanip>  // std::setprecision 

int main() { 
    double f =3.14159; 
    std::cout << std::setprecision(5) << f << '\n'; // prints 3.1416 and not 3.141459 why 
    std::cout << std::setprecision(9) << f << '\n'; 
    std::cout << std::fixed; 
    std::cout << std::setprecision(5) << f << '\n'; 
    std::cout << std::setprecision(9) << f << '\n'; 
    return 0; 
} 

线的std :: COUT < <的std :: setprecision(5)不打印5个十进制数字但的std ::固定被设置后,该setprecision按预期工作。这是为什么 ?。

std :: setprecision()没有std :: fixed是什么作用?

回答

2

根据http://en.cppreference.com/w/cpp/io/ios_base/precision,精度决定多少数字被印刷,许多数字的浮点后没怎么被印刷:

std::ios_base::precision

管理精度(即多少个数字被产生的)漂浮 点输出

这解释了四舍五入。

是的,使用std::fixed将改变floatfield精度的解释。据http://www.cplusplus.com/reference/ios/ios_base/precision/

在固定和科学记数法两者的精度域 指定到底有多少个数字小数点后显示, 即使这包括尾随小数零。在这种情况下,小数点前 之前的数字与精度无关。

+0

然而,细节固定和非固定格式之间有所不同。 –

+0

我更新了答案 – Fabien

2

精度的含义取决于是使用固定的,科学的还是默认的格式。对于固定格式,它是小数点后的位数。对于科学而言,它也是 - 但总是有一个数字在点之前;指数用于将小数点转换为位置。对于默认格式,精度指定打印的总位数(大致;这有点复杂)。

有关详情,请参阅http://en.cppreference.com/w/cpp/io/c/fprintf,特别是%f%e%g格式说明的说明(固定的,科学的和缺省格式,相应地)。指定std::cout << f的行为好像调用printf("%.<precision><format>", f)(对于第一个近似值;实际情况再次稍微复杂一些,但细节与手边的问题无关),其中<precision>setprecision指定的数字,以及<format>f,eg之一。

相关问题