将双数四舍五入到小数点后3点
Round double to 3 points decimal
目前,我可以四舍五入double
到输出流:
output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);
但是我有一个double
,我需要在把它插入一个向量之前进行转换。例如,如果数字-0.00078
出现,那么它等于0.000
,我不需要保存它。另一方面,1.0009
将变成1.001
(与精度函数处理它的方式相同)。
如何在c++中转换双精度?
一个常见的技巧是用数学来做:
value = std::round(value * 1000.0) / 1000.0;
这将缩放值,应用普通四舍五入,然后将其缩小。您可能会有一些精度损失,这是典型的浮点数学,这在double
可以表示的极端范围内是无效的,但通常它"足够好"。
对于更一般的情况,将其放入一个接受四舍五入到任意数量的函数中:
double round_to(double value, double precision = 1.0)
{
return std::round(value / precision) * precision;
}
的例子:
#include <cmath>
#include <iostream>
double round_to(double value, double precision = 1.0)
{
return std::round(value / precision) * precision;
}
int main()
{
double value = 10.0078;
double precision[] = { 0.001, 0.01, 0.1, 1, 2, 3, 4 };
for (double p : precision)
{
double result = round_to(value, p);
std::cout << "round_to(" << value << ", " << p << ") = " << result << "n";
}
}
输出:round_to(10.0078, 0.001) = 10.008
round_to(10.0078, 0.01) = 10.01
round_to(10.0078, 0.1) = 10
round_to(10.0078, 1) = 10
round_to(10.0078, 2) = 10
round_to(10.0078, 3) = 9
round_to(10.0078, 4) = 12
我知道这是一个非常古老的帖子,但我正在寻找解决同样问题的方法。然而,我不想为它创建一个特殊的函数,所以我想出了下面的方法:
#include <sstream>
#include <iomanip>
...
...
...
double val = 3.14159;
stringstream tmp;
tmp << setprecision(3) << fixed << val;
double new_val = stod(tmp.str()); // new_val = 3.143
tmp.str(string()); // clear tmp for future use
不确定这是否是最好的方法,但它对我有效!
这里的其他答案给了您一种技巧。但重要的是要指出,并非所有值都可以精确地表示为浮点数。1.001就是一个很好的例子;最接近的值为1.00099999999999988987。
所以如果你的目标是得到严格的3位小数,那么答案是:那是不可能的
你可以把它乘以1000,然后四舍五入(或截断);这将给你一个1000乘以小数点后3位的值。请注意,如果将其除以1000以得到"四舍五入"的值,您可能会得到超过3位的小数(由于四舍五入错误)。
相关文章:
- 试试完美的正方形,你能给点小费吗
- 无法将结构注册为增强几何体3D点
- C++将浮点指针值舍入为小数位数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在浮点中从大到小会引入更多的误差
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何对点云数据进行排序
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- QML按钮点击功能执行顺序
- 当用户超过按钮点击限制时报告
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 用c++把小数点转换成八进制
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- C++Lua用户数据扰乱了Mathfu浮点值
- 将CHW格式的浮点向量转换为cv::Mat
- 如何在 C++ 中编写带有小数点的浮点值
- std::to_string是否保证在转换浮点值时包含小数点
- 字符串到浮点的转换,同时支持小数点和小数逗号
- 将双数四舍五入到小数点后3点