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

时间:2017-07-13 14:56:07

标签: c++ c++11 stl

如教程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;
}

std :: cout&lt;&lt; std :: setprecision(5)不打印5个十进制数字但在设置了 std :: fixed 之后,setprecision按预期工作。这是为什么 ?。

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

4 个答案:

答案 0 :(得分:2)

根据http://en.cppreference.com/w/cpp/io/ios_base/precision,精确度决定打印的位数,而不是打印浮点数后的位数:

  

std::ios_base::precision

     

管理浮动的精度(即生成多少位数)   点输出

这解释了四舍五入。

是的,使用std::fixed将更改浮点精度的解释。根据{{​​3}}:

  

在固定和科学记数法中,精确字段   准确指定小数点后要显示的位数,   即使这包括尾随十进制零。之前的数字   在这种情况下,小数点与精度无关。

答案 1 :(得分:2)

这是因为&#34;当floatfield设置为fixed时,使用定点表示法写入浮点值:该值用精确字段指定的小数部分中的数字精确表示(精度)并且没有指数部分。&#34; REF。 http://www.cplusplus.com/reference/ios/fixed/

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

g的行为因所选格式而异。

std::setprecision() make std::fixed指的是小数点后打印的位数。在将默认格式更改为std::setprecision()之前,std::fixed已设置,std::defaultfloat设置要打印的总位数,包括小数点前后的位数。

比较

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

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