Trương Đức Vinh
Trương Đức Vinh

Reputation: 129

How do I remove trailing zeros when printing a floating-point number?

I want to ask how to remove trailing zeros after decimal point?

I've read lots of topics about it but I don't understand them clearly. Could you show me any easy understanding ways ?

For example 12.50 to 12.5, but the actual output is 12.50

Upvotes: 11

Views: 28043

Answers (6)

nielsen
nielsen

Reputation: 7594

This is one thing that IMHO is overly complicated in C++. Anyway, you need to specify the desired format by setting properties on the output stream. For convenience a number of manipulators are defined.

In this case, you need to set fixed representation and set precision to 2 to obtain the rounding to 2 decimals after the point using the corresponding manipulators, see below (notice that setprecisioncauses rounding to the desired precision). The tricky part is then to remove trailing zeroes. As far as I know C++ does not support this out of the box, so you have to do some string manipulation.

To be able to do this, we will first "print" the value to a string and then manipulate that string before printing it:

#include <iostream>
#include <iomanip>

int main()
{ 
    double value = 12.498;
    // Print value to a string
    std::stringstream ss;
    ss << std::fixed << std::setprecision(2) << value;
    std::string str = ss.str();
    // Ensure that there is a decimal point somewhere (there should be)
    if(str.find('.') != std::string::npos)
    {
        // Remove trailing zeroes
        str = str.substr(0, str.find_last_not_of('0')+1);
        // If the decimal point is now the last character, remove that as well
        if(str.find('.') == str.size()-1)
        {
            str = str.substr(0, str.size()-1);
        }
    }
    std::cout << str << std::endl;
}

Upvotes: 16

Brian Boddaert
Brian Boddaert

Reputation: 49

std::string example = std::to_string(10.500f);   
 while (example[example.size() - 1] == '0' || example[example.size() - 1] == '.')
        example.resize(example.size() - 1);

Upvotes: 1

Ricky
Ricky

Reputation: 1777

I was stumped by this for a while and didn't want to convert to a string to get the job done, so I came up with this:

float value = 1.00;
char buffer[10];
sprintf(buffer, "%.2f", value);

int lastZero = strlen(buffer);
for (int i = strlen(buffer) - 1; i >= 0; i--)
{
    if (buffer[i] == '\0' || buffer[i]=='0' || buffer[i]=='.')
        lastZero = i;
    else
        break;
}

if (lastZero==0)
    lastZero++;
char newValue[lastZero + 1];
strncpy(newValue, buffer, lastZero);
newValue[lastZero] = '\0';

newValue = 1

Upvotes: 0

Ankit Mishra
Ankit Mishra

Reputation: 590

Just use 'printf' function. printf("%.8g",8.230400); will print '8.2304'

float value =4.5300; printf ("%.8g",value); will return 4.53.

Try this code . It is quite simple.

Upvotes: 0

AshishP
AshishP

Reputation: 39

For C++ check this How to output float to cout without scientific notation or trailing zeros?

using printf() you may use following method to do this,

int main()
{ 
    double value = 12.500;
    printf("%.6g", value );  // 12.5 with 6 digit precision
    printf("%.6g", 32.1234);  // 32.1234
    printf("%.6g", 32.12300000);  // 32.123
}

Upvotes: 1

Harish
Harish

Reputation: 41

you can round-off the value to 2 digits after decimal,

x = floor((x * 100) + 0.5)/100;

and then print using printf to truncate any trailing zeros..

printf("%g", x);

example:

double x = 25.528;
x = floor((x * 100) + 0.5)/100;
printf("%g", x);

output: 25.53

Upvotes: -1

Related Questions