在寻找我的问题的答案后,我决定问。
有人告诉我需要将double的值四舍五入到小数点后三位。
我需要使用这个:
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
发布于 2013-01-11 17:10:19
假设您想要将双精度值放入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)。
发布于 2013-01-11 17:20:55
如果您不想将结果保存为字符串,则可以使用简单的数学方法。
#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。
发布于 2013-01-11 17:54:43
首先:如果您需要使用ostream,您不希望将双精度值四舍五入为三位小数,而是希望显示具有三位小数的值。(要舍入它,您可以使用round( value * 100 ) / 100。)其次,您通常不使用ostream对象,而是使用从ostream派生的类型的对象:通常是ofstream或ostringstream。
问题是您希望这个四舍五入的值出现在哪里。如果你需要在一个文件中使用它,那么你可以使用ofstream;如果你想把它放在一个字符串中(例如放在一个窗口组件中),它就是ostringstream,如果你只是想让它出现在标准输出上,只需要将它输出到cout (它的类型是从ostream派生的)。
此外,完成后不要忘记恢复标志和精度:setf和precision对底层流进行永久更改。
https://stackoverflow.com/questions/14274765
复制相似问题