目前,我可以double使用以下方法将a舍入到输出流:
output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);
Run Code Online (Sandbox Code Playgroud)
但我得到了一个double,我需要在将其插入向量之前进行转换.因此,例如,如果数字-0.00078出现,那么它等于0.000,我不需要保存它.另一方面,1.0009将变为1.001(与精度函数处理它相同).
如何在C++中转换双打?
pad*_*ddy 25
一个常见的技巧是用数学做:
value = round( value * 1000.0 ) / 1000.0;
Run Code Online (Sandbox Code Playgroud)
哪里round会正确处理负值和正值...这样的事情(未经测试):
inline double round( double val )
{
if( val < 0 ) return ceil(val - 0.5);
return floor(val + 0.5);
}
Run Code Online (Sandbox Code Playgroud)
由于浮点精度问题,您仍然希望在输出期间将小数位设置为3.
这里的其他答案给了你一个技巧.但重要的是要提到并非所有值都可以用浮点精确表示.1.001就是一个很好的例子; 最接近的可能值是1.00099999999999988987.
因此,如果您的目标是严格获得3位小数,那么答案是:那是不可能的.
小智 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
Run Code Online (Sandbox Code Playgroud)
不确定这是否是最好的方法,但它对我有用!
您可以将其乘以 1000,然后舍入(或截断)它;这将为您提供 3 位小数位值的 1000 倍。请注意,如果将其除以 1000 以获得“四舍五入”值,则最终可能会保留超过 3 个小数位(由于四舍五入错误)。