0

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

有人告诉我需要将 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

4

3 回答 3

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.

于 2013-01-11T09:20:54.670 回答
1

假设您想将双精度放入 astd::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-11T09:10:18.547 回答
0

第一:如果您需要使用ostream,您不想将 double 的值四舍五入到小数点后三位,而是希望显示小数点后三位的值。(要舍入它,您可以使用 round( value * 100 ) / 100。)其次,您通常不使用 ostream对象,而是使用派生自 的类型的对象 ostream:通常是ofstreamor ostringstream

问题是你希望这个四舍五入的值出现在哪里。如果你需要它在一个文件中,那么你将使用ofstream; 如果你想把它放在一个字符串中(例如放在一个窗口组件中),它就是 ostringstream,如果你只是想让它出现在标准输出上,只需将它输出到cout(它是派生自 的类型 ostream)。

此外,完成后不要忘记恢复标志和精度:setf并对precision底层流进行永久更改。

于 2013-01-11T09:54:43.180 回答