四舍五入到最大N位小数

Round to max N decimals

本文关键字:小数 四舍五入      更新时间:2023-10-16

我知道如何打印一个四舍五入到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位小数,并去除不必要的零。

我该怎么做?

实际上,问题不是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

你可以在这里找到不同模式的文档:

  • fixed
  • scientific
  • hexfloat
  • defaultfloat

您想要的是defaultfloat,顾名思义,它是默认值。

不应抑制末尾出现(看似(多余的零。考虑

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?最后一种形式甚至暗示该值是一个整数,但事实并非如此。