如何指定setprecision舍入

时间:2013-11-28 11:15:46

标签: c++ floating-point

在流式传输到std输出时,我可以指定setprecision来舍入double值吗?

ofile << std::setprecision(12) << total_run_time/TIME << "\n";

输出:     0.756247615801

ofile << std::setprecision(6)<< total_run_time/TIME << "\n";

输出: 0.756248

但我需要输出为0.756247

由于

4 个答案:

答案 0 :(得分:14)

std::fesetround还有<cfenv>,它设置了舍入方向:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cfenv>

int main () {
    double runtime = 0.756247615801;

    // Set rounding direction and output with some precision:
    const auto prev_round = std::fegetround();
    std::fesetround(FE_DOWNWARD);    
    std::cout << "desired: " << std::setprecision(6) << runtime << "\n";

    // Restore previous rounding direction and output for testing:
    std::fesetround(prev_round);
    std::cout << "default: " << std::setprecision(6) << runtime << "\n";
}

(请注意,这些不是我推荐的评论,它们仅用于辅导目的)

输出:

desired: 0.756247
default: 0.756248

重要说明:我没有在标准中找到任何提及,浮动类型operator<<重载具有以遵循舍入方向。

答案 1 :(得分:2)

将除法的结果乘以一百万,转换为整数,除以一百万(作为双精度)。产生输出不需要std::setprecision的副作用。

答案 2 :(得分:2)

另一种方法是通过在输出第二个案例中从double减去0.000005来打败舍入:

total_run_time / TIME - 0.000005

在很多方面我更喜欢这个,因为它避免了整数溢出的可能性。

答案 3 :(得分:1)

std::cout.write(std::to_string(0.756247615801).c_str(), 8);

它看起来很脏,但它有效!