舍入双倍的值

时间:2013-01-11 09:05:53

标签: c++ double rounding ostream

在搜索我的问题的答案后,我决定问。

我被告知需要将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

3 个答案:

答案 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:通常为ofstreamostringstream

问题是您希望显示此舍入值的位置。如果 你需要在一个文件中,然后你将使用ofstream;如果你想 它在一个字符串中(例如放在一个窗口组件中),它就是 ostringstream,如果您只是希望它出现在标准版上 out,只需将其输出到cout(其类型派生自。{1}} ostream)。

另外,不要忘记恢复标志和精度 您已完成:setfprecision对其进行永久性更改 底层流。