【问题标题】:What is the role of **std::setprecision()** without **std::fixed** in c++?c++中没有**std::fixed**的**std::setprecision()**有什么作用?
【发布时间】:2017-07-13 14:56:07
【问题描述】:

如教程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 行不打印 5 个十进制数字,但在设置 std::fixed 后,setprecision 有效正如预期的那样。这是为什么 ?。

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

【问题讨论】:

    标签: c++ c++11 stl precision iomanip


    【解决方案1】:

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

    std::ios_base::precision

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

    这解释了舍入。

    是的,使用std::fixed 将改变对浮点字段精度的解释。根据http://www.cplusplus.com/reference/ios/ios_base/precision/

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

    【讨论】:

      【解决方案2】:

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

      详情见http://en.cppreference.com/w/cpp/io/c/fprintf,特别是%f%e%g格式说明符的说明(对应固定格式、科学格式和默认格式)。 std::cout &lt;&lt; f 被指定为就像调用了 printf("%.&lt;precision&gt;&lt;format&gt;", f) 一样(第一个近似值;实际情况再次有点复杂,但细节与手头的问题无关),其中 &lt;precision&gt; 是由setprecision 指定的数字,并且&lt;format&gt;feg 之一。

      【讨论】:

        【解决方案3】:

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

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

        比较:

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

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

        【讨论】:

          【解决方案4】:

          这是因为“当 floatfield 设置为 fixed 时,浮点值使用定点表示法写入:该值在小数部分中的位数与精度字段 (precision) 指定的位数完全相同,并且没有指数部分。”参考。 http://www.cplusplus.com/reference/ios/fixed/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-28
            • 1970-01-01
            • 1970-01-01
            • 2014-10-09
            • 2011-03-24
            • 1970-01-01
            • 1970-01-01
            • 2021-05-10
            相关资源
            最近更新 更多