如何指定 setprecision 舍入

2022-01-09 00:00:00 floating-point c++

当流到标准输出时,我可以指定 setprecision 来舍入双精度值吗?

Can I specify setprecision to round double values when stream to std output?

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

输出:0.756247615801

Output: 0.756247615801

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

输出:0.756248

但我需要输出为 0.756247

谢谢

推荐答案

还有中的std::fesetround,设置舍入方向:

There is also std::fesetround from <cfenv>, which sets the rounding direction:

#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 << "
";

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

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

输出:

desired: 0.756247
default: 0.756248

重要提示:我没有在标准中发现任何关于浮动类型的 operator<< 重载有遵守舍入方向.

Important note, though: I did not find any mention in the standard, that the operator<< overloads for floating types have to honour the rounding direction.

相关文章