Hi. I have an issue who i can't solve.

The problem is that a = "13.33" and I want it to turn a = 13.33 and not 13.3333333333 and not 13.330000002.

So, how do i make it so "13.33" will be an 13.33 float?

Recommended Answers

All 9 Replies

I do not see problem for that:

>>> a='13.33'
>>> a=float(a)
>>> a
13.33
>>> print(a-13.33)
0.0
>>>

I do not see problem for that:

>>> a='13.33'
>>> a=float(a)
>>> a
13.33
>>> print(a-13.33)
0.0
>>>

But test this.

>>> new = "18,33"
>>> a = new.replace(",",".")
>>> a
'18.33'
>>> a = float(a)
>>> a
18.329999999999998
>>>

It must be 18.33.

It is:

Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> new = '18.33'
>>> new = '18,33'
>>> a = new.replace(',', '.')
>>> a
'18.33'
>>> a = float(a)
>>> a
18.33
>>>
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> new = '18,33'
>>> a = new.replace(',', '.')
>>> a
'18.33'
>>> a = float(a)
>>> a
18.33
>>>

But test this.

>>> new = "18,33"
>>> a = new.replace(",",".")
>>> a
'18.33'
>>> a = float(a)
>>> a
18.329999999999998
>>>

It must be 18.33.

It's impossible to have a float exactly equal to the mathematical 18.33 because 18.33 has too many (or an infinity of) binary digits when it is represented in base 2. Read this http://docs.python.org/tutorial/floatingpoint.html?highlight=arithmetics .

There some interesting builtin methods for floating point numbers by the way:

>>> a=18.33
>>> a.as_integer_ratio()
(1289859080776581L, 70368744177664L)
>>> a.hex()
'0x1.2547ae147ae14p+4'
>>>

It is:

Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> new = '18.33'
>>> new = '18,33'
>>> a = new.replace(',', '.')
>>> a
'18.33'
>>> a = float(a)
>>> a
18.33
>>>
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> new = '18,33'
>>> a = new.replace(',', '.')
>>> a
'18.33'
>>> a = float(a)
>>> a
18.33
>>>

>>> new = '18,33'
>>> a = new.replace(',','.')
>>> a
'18.33'
>>> a = float(a)
>>> a
18.329999999999998
>>>

: S

Is it's impossible?

Since the floating point representation uses 64 bits, it can only represent 2 ** 64, about 18 billion billion numbers. Since there is an uncountable infinity of real numbers, almost all of them must be approximated. So, yes, for most numbers, it's impossible. Also notice that for many problems, this precision suffices.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.