# Printf Question

Discussion in 'C++' started by Mandragon03@gmail.com, Apr 16, 2007.

1. ### Guest

I am looking for a way to take a floating point number and get rid of
any extraneous 0's at the end. For instance if I have

myFloat = 9999;

printf("%f", myFloat);

I get 9999.0000. I want to get rid of these 0's.

Here is one catch. I also need to be able to do this:

myFloat = .531;

printf("%f", myFloat);

I get .5310000

I need to get .531.

I realize I can do this

printf("%2f", myFloat);

which will limit the mantissa to two places, but this will not work
for what i am doing because I can not lose that much precision on
floats like .05369.

Thank you for you time,

Mandragon03

, Apr 16, 2007

2. ### Victor BazarovGuest

wrote:
> I am looking for a way to take a floating point number and get rid of
> any extraneous 0's at the end. For instance if I have
>
> myFloat = 9999;
>
> printf("%f", myFloat);
>
> I get 9999.0000. I want to get rid of these 0's.
>
> Here is one catch. I also need to be able to do this:
>
> myFloat = .531;
>
> printf("%f", myFloat);
>
> I get .5310000
>
> I need to get .531.
>
> I realize I can do this
>
> printf("%2f", myFloat);
>
> which will limit the mantissa to two places, but this will not work
> for what i am doing because I can not lose that much precision on
> floats like .05369.

The problem actually is rather simple. The default is 7 decimal
digits in the result, which means that 0.5310000 and 0.530999951
will give you the same output. The zeros are there to indicate to
what digit the output was _rounded_ to.

If you really need to lose the trailing zeros, you will have to
trim them yourself. Convert your number to a string and drop all
chars from it until the first non-zero:

std:stringstream s;
s << myFloat;
std::string str = s.str();
while (str.size() > 1 && *str.rbegin() == '0')
str.erase(str.size() - 1);

V
--

Victor Bazarov, Apr 17, 2007

3. ### Jack KleinGuest

On Mon, 16 Apr 2007 20:40:32 -0400, "Victor Bazarov"
<> wrote in comp.lang.c++:

> wrote:
> > I am looking for a way to take a floating point number and get rid of
> > any extraneous 0's at the end. For instance if I have
> >
> > myFloat = 9999;
> >
> > printf("%f", myFloat);
> >
> > I get 9999.0000. I want to get rid of these 0's.
> >
> > Here is one catch. I also need to be able to do this:
> >
> > myFloat = .531;
> >
> > printf("%f", myFloat);
> >
> > I get .5310000
> >
> > I need to get .531.
> >
> > I realize I can do this
> >
> > printf("%2f", myFloat);
> >
> > which will limit the mantissa to two places, but this will not work
> > for what i am doing because I can not lose that much precision on
> > floats like .05369.

>
> The problem actually is rather simple. The default is 7 decimal

Correction, 6 decimal places.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html

Jack Klein, Apr 17, 2007
4. ### Guest

On Apr 16, 6:40 pm, "Victor Bazarov" <> wrote:
> wrote:
> > I am looking for a way to take a floating point number and get rid of
> > any extraneous 0's at the end. For instance if I have

>
> > myFloat = 9999;

>
> > printf("%f", myFloat);

>
> > I get 9999.0000. I want to get rid of these 0's.

>
> > Here is one catch. I also need to be able to do this:

>
> > myFloat = .531;

>
> > printf("%f", myFloat);

>
> > I get .5310000

>
> > I need to get .531.

>
> > I realize I can do this

>
> > printf("%2f", myFloat);

>
> > which will limit the mantissa to two places, but this will not work
> > for what i am doing because I can not lose that much precision on
> > floats like .05369.

>
> The problem actually is rather simple. The default is 7 decimal
> digits in the result, which means that 0.5310000 and 0.530999951
> will give you the same output. The zeros are there to indicate to
> what digit the output was _rounded_ to.
>
> If you really need to lose the trailing zeros, you will have to
> trim them yourself. Convert your number to a string and drop all
> chars from it until the first non-zero:
>
> std:stringstream s;
> s << myFloat;
> std::string str = s.str();
> while (str.size() > 1 && *str.rbegin() == '0')
> str.erase(str.size() - 1);
>
> V
> --

I figured as much. Thank you for taking the time to answer my
question. You guys are great =)

, Apr 17, 2007
5. ### Juha NieminenGuest

wrote:
> I am looking for a way to take a floating point number and get rid of
> any extraneous 0's at the end. For instance if I have
>
> myFloat = 9999;
>
> printf("%f", myFloat);
>
> I get 9999.0000. I want to get rid of these 0's.

Have you tried "%g" instead of "%f"?

Juha Nieminen, Apr 18, 2007