Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to specify setprecision rounding

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

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

Output: 0.756247615801

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

Output: 0.756248

But I need the output as 0.756247

Thanks

like image 917
brsbilgic Avatar asked Nov 28 '13 11:11

brsbilgic


People also ask

How do you set the number of decimal places in C++?

Decimal Places This can be done using the fixed keyword before the setprecision() method. When the fixed keyword is used, the argument in the setprecision() function specifies the number of decimal places to be printed in the output.

How do you change precision to decimal in C++?

To set fixed 2 digits after the decimal point use these first: cout. setf(ios::fixed); cout. setf(ios::showpoint); cout.


1 Answers

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.

like image 90
Sebastian Mach Avatar answered Sep 20 '22 05:09

Sebastian Mach