四舍五入到最大N位小数
Round to max N decimals
我知道如何打印一个四舍五入到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.0
、1.
或1
?最后一种形式甚至暗示该值是一个整数,但事实并非如此。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 在除法中不需要四舍五入
- 使用 BMI 计算器对C++中的数字进行四舍五入的问题
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 四舍五入C++
- 返回浮点数的小数位数
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 在数学上将浮点数四舍五入到 N 位小数
- 打印双精度的整个非小数部分
- 如何在C++中对OpenCV垫的小数进行四舍五入?
- 我的替身正在四舍五入小数,我不希望它
- 小数并四舍五入为整数
- 将浮点数四舍五入为2位小数,将其写入文本文件
- 四舍五入到最大N位小数