How to specify setprecision rounding

前端 未结 4 2060
不思量自难忘°
不思量自难忘° 2020-12-02 00:34

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

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


        
相关标签:
4条回答
  • 2020-12-02 01:03
    std::cout.write(std::to_string(0.756247615801).c_str(), 8);
    

    It looks really dirty, but it works!

    0 讨论(0)
  • 2020-12-02 01:08

    Multiply the result of your division by a million, convert to an integer, and divide by a million (as a double). Have the side-effect that std::setprecision is not needed for the output.

    0 讨论(0)
  • 2020-12-02 01:11

    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 << "\n";
    
        // Restore previous rounding direction and output for testing:
        std::fesetround(prev_round);
        std::cout << "default: " << std::setprecision(6) << runtime << "\n";
    }
    

    (note that these are not the kind of comments I recommend, they are just for tutoring purposes)

    Output:

    desired: 0.756247
    default: 0.756248
    

    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.

    0 讨论(0)
  • 2020-12-02 01:19

    Another approach is to defeat the rounding by subtracting, in your second case, 0.000005 from the double before outputting it:

    total_run_time / TIME - 0.000005
    

    In many ways I prefer this as it avoids the potential for integer overflow.

    0 讨论(0)
提交回复
热议问题