# Converting a float to a string without rounding it

### Question

I'm making a program that, for reasons not needed to be explained, requires a float to be converted into a string to be counted with len(). However, str(float(x)) results in x being rounded when converted to a string, which throws the entire thing off. Does anyone know of a fix for it? Here's the code being used if you want to know:

``````len(str(float(x)/3))
``````
1
82
4/1/2015 11:46:35 AM

Some form of rounding is often unavoidable when dealing with floating point numbers. This is because numbers that you can express exactly in base 10 cannot always be expressed exactly in base 2 (which your computer uses).

For example:

``````>>> .1
0.10000000000000001
``````

In this case, you're seeing .1 converted to a string using `repr`:

``````>>> repr(.1)
'0.10000000000000001'
``````

I believe python chops off the last few digits when you use str() in order to work around this problem, but it's a partial workaround that doesn't substitute for understanding what's going on.

``````>>> str(.1)
'0.1'
``````

I'm not sure exactly what problems "rounding" is causing you. Perhaps you would do better with string formatting as a way to more precisely control your output?

e.g.

``````>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'
``````
120
8/23/2009 2:10:13 AM

``````len(repr(float(x)/3))
``````

However I must say that this isn't as reliable as you think.

Floats are entered/displayed as decimal numbers, but your computer (in fact, your standard C library) stores them as binary. You get some side effects from this transition:

``````>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001
``````

The explanation on why this happens is in this chapter of the python tutorial.

A solution would be to use a type that specifically tracks decimal numbers, like python's `decimal.Decimal`:

``````>>> print len(str(decimal.Decimal('0.1')))
3
``````