在搜索我的问题的答案后,我决定问。
我被告知需要将double的值舍入为3位小数。
我需要使用它:
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
所以我理解我需要创建一个ostream类型的对象,所以我写了这个:
ostream os;
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
double a = 3.12364;
os << a;
但是存在编译错误,所以我将第一行更改为:
ostream os(NULL);
然后编译器关闭,但我知道它没有做任何事情。 那么如何使用ostream对值进行舍入?
注意我不想打印。我不需要/想要使用cout答案 0 :(得分:1)
假设您要将双精度放入std::string
,请使用std::ostringstream
(来自std::ostream
)。
ostringstream os;
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
double a = 3.12364;
os << a;
std::string rounded( os.str() ); // get the result
如果要以数学方式对其进行舍入,请执行
round( a * 1000 ) / 1000
在等式中间使用字符串始终是红旗; v)。
答案 1 :(得分:1)
如果您不想将结果保存在字符串中,可以使用普通数学。
#include <cmath>
float myRound(float input) {
return input > 0
? floor(input * 1000 + 0.5) / 1000
: ceil(input * 1000 + 0.5) / 1000;
}
请注意,如果乘以1000会导致溢出,则结果将不正确。在C ++ 11中,您还可以使用std::round
。
答案 2 :(得分:0)
首先:如果你需要使用ostream
,你不想围绕
要显示的小数点后三位的值
三位小数的值。 (围绕它,你会使用
round( value * 100 ) / 100
。)其次,你通常不使用
ostream
对象,您使用派生自的类型的对象
ostream
:通常为ofstream
或ostringstream
。
问题是您希望显示此舍入值的位置。如果
你需要在一个文件中,然后你将使用ofstream
;如果你想
它在一个字符串中(例如放在一个窗口组件中),它就是
ostringstream
,如果您只是希望它出现在标准版上
out,只需将其输出到cout
(其类型派生自。{1}}
ostream
)。
另外,不要忘记恢复标志和精度
您已完成:setf
和precision
对其进行永久性更改
底层流。