在C ++中没有** std :: fixed **的** std :: setprecision()**的作用是什么?

Tal*_*Kit 5 c++ stl c++11

如教程http://www.cplusplus.com/reference/iomanip/setprecision/中所示

// 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;
}
Run Code Online (Sandbox Code Playgroud)

该生产线的std ::法院<<的std :: setprecision(5)不打印5个十进制数字,但之后的std ::固定设置,如预期的那样setprecision作品。这是为什么 ?。

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

Fab*_*ien 5

根据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/

在固定和科学记数法中,精度字段都精确指定要在小数点后显示多少个数字,即使其中包括尾随的十进制零也是如此。在这种情况下,小数点前的数字与精度无关。


Igo*_*nik 5

精度的含义取决于使用的是固定格式、科学格式还是默认格式。对于固定格式,它是小数点后的位数。对于科学,它也是——但在点之前总是有一个数字;指数用于将小数点移动到位。对于默认格式,precision 指定打印的总位数(粗略地说;它有点复杂)。

有关详细信息,请参阅http://en.cppreference.com/w/cpp/io/c/fprintf,特别是%f,%e%g格式说明符的说明(相应地用于固定、科学和默认格式)。std::cout << f被指定为好像printf("%.<precision><format>", f)被调用一样(第一次近似;实际情况又有点复杂,但细节与手头的问题无关),其中<precision>是 指定的数字setprecision<format>是 中的一个feg


KjM*_*Mag 5

的行为std::setprecision()因所选格式而异。

std::fixedmakestd::setprecision()指的是小数点后打印了多少位数字。在将默认格式更改为 之前std::fixedstd::defaultfloat设置std::setprecision()为要打印的总位数,包括小数点前后的位数。

相比:

http://www.cplusplus.com/reference/ios/defaultfloat/

http://www.cplusplus.com/reference/ios/fixed/