【问题标题】:How to output with 3 digits after the decimal point with C++ stream?如何使用 C++ 流输出小数点后 3 位数字?
【发布时间】:2012-01-23 04:14:17
【问题描述】:

给定一个float类型的变量,如何在C++中使用iostream输出小数点后3位?

【问题讨论】:

    标签: c++ floating-point iostream


    【解决方案1】:

    使用setfprecision

    #include <iostream>
    
    using namespace std;
    
    int main () {
        double f = 3.14159;
        cout.setf(ios::fixed,ios::floatfield);
        cout.precision(3);
        cout << f << endl;
        return 0;
    }
    

    这打印3.142

    【讨论】:

    • 这适用于 3.14159,但不适用于 13.14159。您的解决方案仅适用于小于 10 的数字。
    • @manler 你说得对,我原来的帖子没有,但最后一篇(我在 11 分钟前编辑的)可以正常工作。我用小数点前 2 位和 3 位数字进行了验证,它按预期打印了 3 位数字。
    【解决方案2】:

    这个确实显示“13.141”

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main(){
        double f = 13.14159;
        cout << fixed;
        cout << setprecision(3) << f << endl;
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用iomanip 标头获得固定数量的小数位数(以及许多其他内容)。例如:

      #include <iostream>
      #include <iomanip>
      
      int main() {
          double pi = 3.141592653589;
          std::cout << std::fixed << std::setprecision(2) << pi << '\n';
          return 0;
      }
      

      将输出:

      3.14
      

      请注意fixedsetprecision 都会永久更改流,因此,如果要本地化效果,可以预先保存信息并在之后恢复:

      #include <iostream>
      #include <iomanip>
      
      int main() {
          double pi = 3.141592653589;
      
          std::cout << pi << '\n';
      
          // Save flags/precision.
          std::ios_base::fmtflags oldflags = std::cout.flags();
          std::streamsize oldprecision = std::cout.precision();
      
          std::cout << std::fixed << std::setprecision(2) << pi << '\n';
          std::cout << pi << '\n';
      
          // Restore flags/precision.
          std::cout.flags (oldflags);
          std::cout.precision (oldprecision);
      
          std::cout << pi << '\n';
      
          return 0;
      }
      

      输出是:

      3.14159
      3.14
      3.14
      3.14159
      

      【讨论】:

      • 感谢您展示如何保存和恢复流设置,非常有帮助。
      • 使用这一行 " using namespace std; "获得更简洁的代码
      • @Khaled,有支持和反对的论据足够复杂,以至于它们不适合评论框:-) 我自己更喜欢显式命名空间,但最简单的程序除外,或者,最低限度,使用命名空间的特定项目,而不是全部导入。但是,该特定讨论与问题和我的答案无关。
      【解决方案4】:

      如果要打印精度为小数点后3位的数字,只需在打印数字cout &lt;&lt; std::setprecision(3) &lt;&lt; desired_number之前添加以下内容即可。不要忘记在您的代码中添加#include &lt;iomanip&gt;

      【讨论】:

        【解决方案5】:

        一般来说,precision是显示的最大位数。操纵器fixed 将设置输出流以fixed 格式显示值。在 fixed 中,precision 是小数点后的位数。 setprecision 允许设置用于显示浮点值的精度,它需要一个整数参数。

        cout << fixed;
        cout << setprecision(3) << f << endl;
        

        您可以使用 cout.unsetf(ios::fixed)

        取消设置 fixed

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多