目前,我可以使用:
将double
舍入到输出流
output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);
但我得到了double
,我需要在将其插入向量之前进行转换。例如,如果出现数字-0.00078
,那么它等于0.000
,我将不需要保存它。另一方面,1.0009
将变为1.001
(与精确函数处理它相同)。
如何在C ++中转换双倍的双打?
答案 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个小数位(由于舍入错误)。