如何解决如何为代码块中的所有 cout 设置精度?
我不想重复使用 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;
}
感谢任何建议。
解决方法
举个例子:
#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;
}
,
有一个警告,设置 .precision()
和流标志 std::fixed
和 std::showpoint
等将修改流标志,如 @dxiv 在他现在删除答案并在程序范围内修改流行为。这很重要,无论设置在哪里,都会对整个程序产生影响。
通常您想为有限的目的更改格式,例如<<
类重载中的所有浮点输出,或标题所指示的“代码块” ,等等...如果您在重载的成员函数中进行更改,它会影响整个程序中的 std::cout
- 这可能不是预期的。
C++ 提供了一种简单的机制来临时进行更改,方法是在调整流之前保存流 .flags()
,然后在完成后,在离开需要更改的范围之前恢复原始标志。这将撤消 std::ios_base::fmtflags,例如std::fixed
和 std::showpoint
设置,但必须通过恢复默认值 .precision()
来撤消 6
更改。
要在进行更改之前保存流标志,您可以使用:
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::fixed
、std::showpoint
等。单独或 (2,3) 您可以直接使用 std::ios_base::setf 或通过声明 BitmaskType std::ios_base::fmtflags 来操作标志。要直接设置 std::fixed
和 std::showpoint
标志,您可以执行以下操作:
std::cout.setf (std::ios_base::fixed,std::ios_base::showpoint);
要使用 BitmaskType,您需要创建该类型的实例,并通过 OR'ing 和 AND'ing 值为所需标志设置值。然后使用 .flags()
成员函数设置标志值,与传递保存的格式标志以取消使用原始标志状态的已保存位图所做的更改相同的方式。上面的 std::ios_base::fmtflags
链接提供了每种方式的示例。
在更改前保存,然后在完成后恢复标志会重置标志,无论您使用哪种方法设置它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。