25

目前,我可以double使用以下方法将 a 舍入到输出流:

output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);

但是我得到了一个double,我需要在将其插入向量之前进行转换。例如,如果-0.00078出现数字,那么它等于0.000,我不需要保存它。另一方面,1.0009将成为1.001(与精度函数处理它相同)。

如何在 C++ 中转换这样的双精度数?

4

4 回答 4

40

一个常见的技巧是用数学来做:

value = round( value * 1000.0 ) / 1000.0;

哪里round可以正确处理负值和正值......这样的事情(未经测试):

inline double round( double val )
{
    if( val < 0 ) return ceil(val - 0.5);
    return floor(val + 0.5);
}

由于浮点精度问题,您仍然希望在输出期间将小数位设置为 3。

于 2013-01-16T23:25:14.840 回答
10

我知道这是一篇非常古老的帖子,但我一直在寻找解决同一问题的方法。但是,我不想为它创建一个特殊的函数,所以我想出了以下内容:

#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

不确定这是否是最好的方法,但它对我有用!

于 2017-05-01T16:48:07.587 回答
9

这里的其他答案给了你一种技巧。但重要的是要提到并非所有值都可以用浮点数精确表示。1.001 就是一个很好的例子;最接近的可能值为 1.00099999999999988987。

因此,如果您的目标是严格保留 3 位小数,那么答案是:这是不可能的。

于 2013-01-16T23:29:07.873 回答
5

您可以将其乘以 1000,然后对其进行舍入(或截断);这将为您提供 3 位小数位值的 1000 倍的值。请注意,如果您将其除以 1000 以获得“四舍五入”值,您最终可能会得到多于 3 位小数(由于舍入错误)。

于 2013-01-16T23:25:02.890 回答