圆形双倍至3位小数

时间:2013-01-16 23:19:34

标签: c++ rounding

目前,我可以使用:

double舍入到输出流
output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);

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

如何在C ++中转换双倍的双打?

4 个答案:

答案 0 :(得分:24)

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

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。

答案 1 :(得分:7)

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

#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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

你可以将它乘以1000然后再舍入(或截断)它;这将给你一个3倍小数位值1000倍的值。请注意,如果将其除以1000以获得“四舍五入”值,则最终可能会超过3个小数位(由于舍入错误)。