eveo
eveo

Reputation: 2843

Float formatting in C++

How do you format a float in C++ to output to two decimal places rounded up? I'm having no luck with setw and setprecision as my compiler just tells me they are not defined.

cout << "Total : " << setw(2) << total << endl;

total outputs: Total : 12.3961

I'd like it to be: 12.40 or 12.39 if it's too much work to round up.

Upvotes: 25

Views: 128021

Answers (6)

vitaut
vitaut

Reputation: 55745

You can do it with C++20 std::format:

std::cout << std::format("Total     : {:.2f}\n", total);

or the fmt::format function from the {fmt} library, std::format is based on. {fmt} also provides the print function that integrates formatting and output making it even easier and more efficient (godbolt):

#include <fmt/core.h>

int main() {
  fmt::print("Total     : {:.2f}\n", 12.3961);
}

Output:

Total     : 12.40

This uses the IEEE754 default rounding mode (round to nearest even) so you'll have to round up yourself (How do I round up/down a decimal place of a float value? C++).

Upvotes: 9

jmarcio
jmarcio

Reputation: 96

This is a little dirty...

template <typename T>
string sFormat(const char *f, T value)
{
    char buffer[64];
    snprintf(buffer, sizeof(buffer), f, value);
    return string(buffer);
}

And do things like this :

cout << "Result :" << sFormat(" %5.2f", 3.14) << sFormat(" %5d", 2300) << endl;

Upvotes: 3

Jon Spencer
Jon Spencer

Reputation: 609

Use cout << fixed or cout.setf(ios::fixed), and std::cout.precision(<# of decimal digits>) as in the following (using the Clang-503.0.40 compiler included with OSX Mavericks):

#include <iostream>

int main()
{
   using namespace std;

   float loge = 2.718;
   double fake = 1234567.818;
   cout << fixed;
   cout.precision(2);
   cout << "loge(2) = " << loge << endl;
   cout << "fake(2) = " << fake << endl;
   cout.precision(3);
   cout << "loge(3) = " << loge << endl;
   cout << "fake(3) = " << fake << endl;
}

The output from this is (note the rounding):

loge(2) = 2.72
fake(2) = 1234567.82
loge(3) = 2.718
fake(3) = 1234567.818

This is the simple version. In lieu of using cout << fixed;, you can use cout.setf(ios::fixed); (for displaying scientific notation, replace fixed with scientific; both will set the number of digits to the right of the decimal point). Note the cout.precision() is also used to set the number of digits displayed in total on either side of the decimal point if the format flags do not include fixed or scientific. There are tutorials for this on the Internet.

Upvotes: 21

Rapptz
Rapptz

Reputation: 21317

If you want the trailing zero from rounding, you can use the C function printf.

#include <iostream>
#include <cstdio>

int main() {
    float v = 12.3961;
    std::printf("%.2f",v); //prints 12.40
}

Compared to:

#include <iostream>
#include <iomanip>

int main() {
    float v = 12.3961;
    std::cout << std::setprecision(4) << v; //prints 12.4
}

Upvotes: 9

leemes
leemes

Reputation: 45745

To also include the trailing zero, it isn't sufficient to set the precision. You also have to change the floating point format to fixed format, which uses the number of digits as told by setprecision as the number of digits after the decimal point:

std::cout << std::fixed << std::setprecision(2) << v;

Working online example code

Upvotes: 12

billz
billz

Reputation: 45470

You need to include <iomanip> and provide namespace scope to setw and setprecision

#include <iomanip>
std::setw(2)
std::setprecision(5)

try:

cout.precision(5);
cout << "Total : " << setw(4)   << floor(total*100)/100 << endl;

or

 cout << "Total : " << setw(4)   << ceil(total*10)/10 << endl;

iostream provides precision function, but to use setw, you may need to include extra header file.

Upvotes: 19

Related Questions