【问题标题】:How to set precision for all cout in the code block?如何为代码块中的所有 cout 设置精度?
【发布时间】:2021-02-14 05:47:45
【问题描述】:

我不想重复使用 setprecision 并固定在 cout 上。那么有什么办法可以只设置一个并将其用于代码块中的所有 cout 吗?'

int main()
{
  double num1 = 1.00000, num2 = 2.00005;
  cout **<< setprecision(5) << fixed <<** num1 << endl; <-- I do not to repeatedly set this.
  cout **<< setprecision(5) << fixed** << num2 << endl;
}

我在下面尝试过,但它不起作用

int main()
{
   double num1 = 1.00000, num2 = 2.00005;
   cout.precision(5); cout.fixed; cout.showpoint; <-- Does not work
   cout << num1 << endl << num2 << endl;
}

欢迎提出任何建议。

【问题讨论】:

  • 创建一个函数并传递你想要的 cout 作为参数

标签: c++ cout


【解决方案1】:

举个例子:

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

现在这给了我们一个输出:

3.1416

3.14159

3.1415900000

现在,在您的情况下,代码应如下所示:

#include <iostream>
int main () {
double num1 = 1.00000, num2 = 2.00005;
std::cout.unsetf ;                
std::cout.precision(5);
std::cout << num1 <<endl;
std::cout << num2 <<endl;
return 0;
}

如果上述方法不起作用,我认为您将不得不重复并再次定义精度。

#include <iostream>
int main () {
double num1 = 1.00000, num2 = 2.00005;
std::cout.unsetf ;                
std::cout.precision(5);
std::cout << num1 <<endl;
std::cout.precision(5);
std::cout << num2 <<endl;
return 0;
}

【讨论】:

    【解决方案2】:

    有一个警告,设置.precision() 和流标志std::fixedstd::showpoint 等将修改流标志,如@dxiv 在他现在删除的答案中指示的那样,并修改流行为程序-宽的。这很重要,并且无论设置在何处都会对整个程序产生影响。

    通常您希望更改格式以用于有限的目的,例如&lt;&lt; 类重载中的所有浮点输出,或标题所示的“代码块”等...如果您在重载的成员函数中进行更改,它会影响整个程序中的std::cout——这可能不是有意的。

    C++ 提供了一种简单的机制来临时进行更改,方法是在调整流之前保存流.flags(),然后在完成后恢复原始标志,然后再离开所需更改的范围。这将撤消 std::ios_base::fmtflags,例如std::fixedstd::showpoint 设置,但必须通过恢复 6 的默认值来撤消 .precision() 更改。

    要在进行更改之前保存流标志,您可以使用:

        std::ios_base::fmtflags f = std::cout.flags();      /* save format flags */
    

    完成需要更改的输出后,您可以使用以下命令恢复标志:

        std::cout.flags(f);                                 /* restore saved flags */
    

    恢复默认的.precision() 需要将精度设置回默认的6,例如

        std::cout.precision(6);                             /* restore precision */
    

    有两种(实际上是三种)设置格式标志的方法。 (1) 您可以使用,例如std::fixedstd::showpoint 等单独或 (2,3) 您可以直接使用 std::ios_base::setf 或通过声明 BitmaskType std::ios_base::fmtflags 来操作标志。要直接设置std::fixedstd::showpoint 标志,您可以:

    std::cout.setf (std::ios_base::fixed, std::ios_base::showpoint);
    

    要使用 BitmaskType,您将创建该类型的一个实例,并通过 OR'ing 和 AND'ing 值来设置所需标志的值。然后,.flags() 成员函数用于设置标志值,就像您传递保存的格式标志一样,您使用保存的原始标志状态的位图进行了过度更改。上面的std::ios_base::fmtflags 链接提供了每种方式的示例。

    在更改之前保存,然后在完成后恢复标志会重置标志,无论您使用哪种方法设置它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2015-07-03
      • 2010-10-07
      相关资源
      最近更新 更多