首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对双精度值进行四舍五入

对双精度值进行四舍五入
EN

Stack Overflow用户
提问于 2013-01-11 17:05:53
回答 3查看 539关注 0票数 0

在寻找我的问题的答案后,我决定问。

有人告诉我需要将double的值四舍五入到小数点后三位。

我需要使用这个:

代码语言:javascript
复制
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);

所以我知道我需要创建一个ostream类型的对象,所以我写了这个:

代码语言:javascript
复制
ostream os;
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
double a = 3.12364;
os << a;

但是有一个编译错误,所以我将第一行改为:

代码语言:javascript
复制
ostream os(NULL);

然后编译器就闭嘴了,但我知道它什么也没做。那么如何使用ostream对值进行舍入呢?

请注意,我不想打印。我不需要/不想使用cout

EN

回答 3

Stack Overflow用户

发布于 2013-01-11 17:10:19

假设您想要将双精度值放入std::string中,请使用std::ostringstream (从std::ostream派生)。

代码语言:javascript
复制
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

如果你想在数学上对它进行舍入,那么就这样做

代码语言:javascript
复制
round( a * 1000 ) / 1000

在等式中间使用字符串始终是一个危险信号;v)。

票数 1
EN

Stack Overflow用户

发布于 2013-01-11 17:20:55

如果您不想将结果保存为字符串,则可以使用简单的数学方法。

代码语言:javascript
复制
#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

票数 1
EN

Stack Overflow用户

发布于 2013-01-11 17:54:43

首先:如果您需要使用ostream,您不希望将双精度值四舍五入为三位小数,而是希望显示具有三位小数的值。(要舍入它,您可以使用round( value * 100 ) / 100。)其次,您通常不使用ostream对象,而是使用从ostream派生的类型的对象:通常是ofstreamostringstream

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14274765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档