【发布时间】:2017-09-16 22:00:51
【问题描述】:
我知道以前有人问过这个问题,但是在一堆我无法真正理解的不同上下文中(因为我是 c++ 语言的新手,以前来自 java)。我的问题与iomanip 中的std::fixed 和setprecision() 有关。
我有以下简单的双精度:
double price = 7.50001;
有了这个,我希望它按照正常价格输出:
cout<< "The price is:$" <<fixed<<setprecision(2)<< price <<endl;
但是现在由于std::fixed,我从现在开始使用的每个cout 都会有precision(2)。我的问题是我如何回滚到以前的精度,即如果我添加另一个双精度,比如6.5100000,输出将是6.5,像6.200000 这样的双精度将是6.2,6.15555 将是@ 987654336@ 等(如前所述)。
请注意,我已经尝试按照谷歌的方式使用它:
std::streamsize ss = std::cout.precision();
... 然后使用 ss 重置精度,但是这不起作用,因为输出仍然包含它以前没有的尾随零。例如,6.50 在输出 6.5 之前输出 6.50(对于之前的任何双精度都是如此,它消除了尾随零)。
【问题讨论】:
-
你可以随时get the previous precision,用它来重置。
-
我尝试过使用这种方法,但是例如给定双精度 7.50001 并使用 cout.precision(2) 然后输出双精度它给我 7.5 而不是 7.50,这不是下面示例中显示的网址。
-
int previousPrecision = cout.precision(); cout
-
Protip:iostream 的格式化方法是丑陋的、令人困惑的和冗长的,与 C 的
printf(以及命名-whatever-other-language 基于占位符的格式化)相比,这是一个巨大的退步,并且,你注意到了,有状态的格式化程序是一场噩梦。如果您想在不生气的情况下进行模糊详细的格式化,请使用 C 的printf-family 函数:这整个难题被解决为printf("The price is: $%0.2f\n", price);。清晰度的差异(以及没有与状态相关的问题)是如此惊人,以至于它不需要 cmets。