简体   繁体   中英

how to convert string to numeric in python

I would like to convert string (%) to float.but my method didnt work well. the result slightly differ from correct number. for example,

a=pd.Series(data=["0.1%","0.2%"])

0    0.1%
1    0.2%
dtype: object

first, I strip "%"

a.str.rstrip("%")

0    0.1
1    0.2
dtype: object

I tried to convert to numeric, but the result is strange.

I guess this phenomena come from binary digit system...

pd.to_numeric(a.str.rstrip("%"))

0    0.10000000000000000555
1    0.20000000000000001110
dtype: float64

and of course I couldnt convert % to numeric.

pd.to_numeric(a.str.rstrip("%"))/100

0    0.00100000000000000002
1    0.00200000000000000004
dtype: float64

I also tried .astype(float) method. but The result was same..

why this phenomena happen ? and how can I avoid this phenomena

Many rational numbers can't be represented exactly as a floating-point number. In particular, any number that has to have a five as a factor in the denominator, like 1/(2*5), can't be represented exactly. There isn't much you can do about this: either round the displayed number so it looks right, or use an infinite-precision library or a rational-numbers library. Here's a basic way to round the displayed number:

>>> print "%.20f" % 0.1
0.10000000000000000555
>>> print "%.4f" % 0.1
0.1000

As a folow-up to the suggestion by @D-Von, the following python packages can be useful to you: decimal and fractions

Then you can do some things like:

from fractions import Fraction
from decimal import Decimal
f = Fraction(1, 10)
d = Decimal('0.1')
f = f/100
d = d/100
str(d)

And all the time you are not working with floats but with rational numbers. See the documentation for more examples.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM