4

注意:我知道有一些类似的问题,但我在这里找不到我要问的答案。

我想将 double 打印到 std::ostream 向 +oo 或 -oo 舍入 n 位小数。

乘以 10^n、floor'ing 或 ceil'ing,然后将结果乘以 10^-n 不是一种选择,因为结果可能无法表示。

到目前为止,我有以下内容:

#include <iostream>
#include <cfenv>

int main()
{
    double one_third = 1.0/3.0;
    std::cout.precision(4);
    fesetround(FE_DOWNWARD);
    std::cout << one_third << std::endl;
    fesetround(FE_UPWARD);
    std::cout << one_third << std::endl;
}

gcc-4.7.2 的输出如下:

0.3333
0.3333

我期待:

0.3333
0.3334

那么这段代码有什么问题呢?

谢谢!

4

1 回答 1

3

编辑:这一定是 GCC 4.7.2 错误。该代码在 GCC 4.8.1 中运行良好,但在 4.7.2 中失败。

此代码(ideone.com 上的示例)适用于 GCC 4.8.1:

#include <iostream>
#include <cfenv>

int main()
{
    double one_third = 1.0/3.0;
    std::cout.precision(4);

    std::fesetround(FE_DOWNWARD);
    std::cout << one_third << std::endl;

    std::fesetround(FE_UPWARD);
    std::cout << one_third << std::endl;

    return (0);
}

程序输出:

0.3333
0.3334
于 2013-09-12T13:46:12.460 回答