舍入到最大N位小数

时间:2014-04-29 16:42:09

标签: c++ rounding

我知道如何将舍入数字打印为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位小数并删除不必要的零。

我该怎么办?

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;
}

output

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.01.1?最后一种形式甚至暗示该值是一个整数,它不是。