【发布时间】:2019-04-01 12:27:41
【问题描述】:
在返回“默认格式”的意义上,我遇到了浮点值的格式问题。 假设我有 2 个花车:
float f1 = 3.0f, f2 = 1.5f;
std::cout << f1 << " - " << f2 << "\n";
将显示为:3 - 1.5
现在,出于某种原因,我需要在 std::cout 上设置精度(用于其他打印):
cout << std::precision(2);
如果我再次打印我的两个浮点数,这将导致:3.00 - 1.50
现在我想恢复默认格式。在 C++11 之前,这似乎很困难(或者是吗?)。但是,谢谢,我现在得到了这个新标志: std::defaultfloat。让我们试试:
std::cout << std::defaultfloat << f1 << " - " << f2;
将打印:3 - 1.50。很好。
哦,等一下。说我有:
float f1 = 444.0f, f2 = 444.5f;
默认打印将显示:444 - 444.5
设置精度(和“固定”):
cout << std::precision(2) << std::fixed;
将显示:444.00 - 444.50
但回到“默认”:
std::cout << std::defaultfloat << f1 << " - " << f2;
将打印:4.4e+02 - 4.4e+02(自动切换到科学格式)。而且,如果您想知道,附加“固定”标志将保持先前分配的精度,因此不会返回到原始设置。
问题:如何回到默认模式?
FWIW,live code is here.
编辑:此问题已被标记为欺骗,但linked answer 没有提供问题的答案,它只提到如何获得当前精度。
编辑 2:根据要求,这里是演示问题的完整代码:
int main()
{
float f1 = 444.5f, f2=443.0f;
std::cout << f1 << " - " << f2 << "\n";
std::cout << std::fixed << std::setprecision(2);
std::cout << f1 << " - " << f2 << "\n";
std::cout << std::defaultfloat;
std::cout << f1 << " - " << f2 << "\n";
}
结果:
444.5 - 443
444.50 - 443.00
4.4e+02 - 4.4e+02
【问题讨论】:
-
我不确定你为什么会遇到这个问题,但是在 C++11 之前就已经存在并且现在仍然可以使用的一种解决方案是 Boost 的 I/O Stream State Saver 库:@ 987654324@
-
谢谢!不知道那个(Boost中有很多东西......),我会试一试。但是标准库不应该这样做吗?或者,至少,指定一个设置说“如果小数部分为 0,则打印为整数”?
-
@JohnZwinck 好的,检查了另一个答案。但是,它并没有真正回答这里的问题(尽管它给了我一个提示)。您能否重新打开,以便我可以添加我自己同时提出的答案。
-
这将改善问题,让MCVE 显示问题中的不良行为,而不是一系列 sn-ps 和/或外部 MCVE 链接。此外,您不需要展示正常工作的案例。
-
@M.M 正确,我编辑了问题。
标签: c++ floating-point precision iomanip