我知道如何将舍入数字打印为N个小数,如下所示:
using namespace std;
cout << setprecision(N) << fixed;
float k = 1.23441;
cout << k;
让我们使用例如N = 2.
这将输出1.23,这是好的,但如果k是1.0012,它将输出1.00,我希望它输出1.如果k是1.1045,它将输出1.10,我希望它输出1.1,所以我想舍入到2位小数并删除不必要的零。
我该怎么办?
答案 0 :(得分:2)
实际上,问题不是setprecision
,而是fixed
。使用fixed
,明确要求拥有固定数量的数字!
如果您使用setprecision
而不使用fixed
,那么它将完全符合您的要求:
#include <iostream>
#include <iomanip>
int main() {
double const number = 123.456789;
for (int i = 0; i != 15; ++i) { std::cout << i << ": " << std::setprecision(i) << number << "\n"; }
return 0;
}
0: 1e+02
1: 1e+02
2: 1.2e+02
3: 123
4: 123.5
5: 123.46
6: 123.457
7: 123.4568
8: 123.45679
9: 123.456789
10: 123.456789
11: 123.456789
12: 123.456789
13: 123.456789
14: 123.456789
您可以找到有关不同模式here的文档:
fixed
scientific
hexfloat
defaultfloat
你想要的是defaultfloat
,顾名思义是默认的。
答案 1 :(得分:1)
不应该抑制最终(看似)冗余零的出现。考虑
1.2
1.23
1.234
1.2000
1.2300
1.2340
第一个数字表示它是1.2 +/- 0.05,下一个表示它是1.23 +/- 0.005,第三个表示1.234 +/- 0.0005。
相反,以下所有数字都表示精度不会超过0.00005。
因此,删除小数部分中的尾随零并不是一种使日期更具可读性的方法;通常,缺少尾随数字被理解为表明计算缺乏精确性。
<强>后来强>
如果转换不符合您的要求,则必须明确编码从格式化转换产生的字符串中删除字符。因此,使用最接近您的要求的格式转换为字符串,然后对字符串进行后处理。
如果字符串是某些定点格式转换的结果,则根据模式\d+\.\d+
,您可以从末尾反向扫描字符串(提示:string::find_last_not_of
)。是否要将1.000
截断为1.0
或1.
或1
?最后一种形式甚至暗示该值是一个整数,它不是。