将双数四舍五入到小数点后3点

Round double to 3 points decimal

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

目前,我可以四舍五入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位的小数(由于四舍五入错误)。