NewToCoding
NewToCoding

Reputation: 19

Printing correct number of decimal points using %f c++

I am trying to print a number up to say 5 decimal places.

I have:

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    float a = 987.65;
    float b = 1.23456789;
    scanf("%f %f", &a, &b);
    printf("%.5f %.5f", a, b);
    return 0;
}

I get the result as 987.65000 and 1.23456 I want the result to be 987.65 and 1.23456, so basically I want up to 5 i.e <=5 decimal digits in my answer.

Upvotes: 0

Views: 401

Answers (3)

perspicuousreading
perspicuousreading

Reputation: 153

A slightly less technical way to do it would be using setprecision, as displayed below:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    float a = 987.65;
    float b = 1.23456789;

    cout << setprecision(5);
    cout << a << " " << b << endl;

    return 0;
}

Output:

987.65 1.2346

Upvotes: 4

space_voyager
space_voyager

Reputation: 2034

Here's a solution that does what you want:

#include <iostream>
#include <cstdio>
using namespace std;

unsigned int numPlaces = 5; //number of decimal places

unsigned int determinePlaces (float number) {
    unsigned int myPlaces = 0;
    while (number != (int)(number) && myPlaces<=numPlaces-1) {
        number = number*10;
        myPlaces++;
    }
    return myPlaces;
}

int main() {
    float a = 987.65;
    float b = 1.23456789;

    printf("%.*f %.*f\n", determinePlaces(a), a, determinePlaces(b), b);
    return 0;
}

Output:

987.65 1.23457

Basically, the code keeps on multiplying the goat by 10 until the cast to an integer (essentially taking the floor value) matches the float. If it doesn't when it reaches the fifth multiplication by 10, we satisfy ourselves with a printf of 5 decimal places. Otherwise, we print the amount that was necessary to make the match to the floor value.

Upvotes: 0

Thomas Matthews
Thomas Matthews

Reputation: 57678

The fundamental problem is that a computer can't exactly represent most floating point numbers.

Also, you want a complex formatting rule: if ending digits are zero, print spaces.

The problem is that your number 987.65000 could be represented as 98.6500001 and so wouldn't work with your formatting rule.

I believe you will have to write your own formatting function to achieve the functionality you are looking for.

Upvotes: 1

Related Questions