2016-09-07 42 views
2

我想將字符串(%)轉換爲float.but我的方法沒有效果。 結果與正確的數字略有不同。 例如,如何將字符串轉換爲數字python

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

0 0.1% 
1 0.2% 
dtype: object 

第一,我剝 「%」

a.str.rstrip("%") 

0 0.1 
1 0.2 
dtype: object 

我試圖轉換爲數值,但結果是奇怪。

我想這個現象來自二進制數字系統...

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

0 0.10000000000000000555 
1 0.20000000000000001110 
dtype: float64 

,當然我不能轉換%至數字。

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

0 0.00100000000000000002 
1 0.00200000000000000004 
dtype: float64 

我也試過.astype(float)方法。但結果相同..

爲什麼會發生這種現象?以及如何避免這種現象

+0

你只是想要它很好地顯示?看看'pd.options.display.float_format'。以上是浮動的預期行爲(請參閱http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples) – AChampion

+0

感謝您的回覆我想處理巨大的數量,如預算計算。我遇到了一些關於這種計算的麻煩......所以我想精確計算。通過使用這個選項,我可以避免這種麻煩嗎? – Heisenberg

回答

2

許多有理數不能完全表示爲浮點數。尤其是,任何必須有5作爲分母因子的數字,如1 /(2 * 5),都不能完全表示。關於這一點你可以做的事情不多:或者將顯示的數字四捨五入以使其看起來正確,或者使用無限精度庫或有理數庫。這裏是圓的顯示號碼的基本途徑:

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

+0

謝謝。我想計算十億像數,例如10億* 0.1%。我可以得到正確的結果嗎? – Heisenberg

+1

不一定。在這種情況下,你會這樣做,因爲結果(一百萬)是一個完全在可表示整數範圍內的整數。在其他情況下,你會得到一個非常非常接近正確答案的結果,但不完全正確。如果你真的需要精確的結果,你應該閱讀諸如數值分析,IEEE 754浮點標準和Python十進制數據庫(它以內存和時間以及代碼複雜度爲代價提供確切的結果)等主題。但是很可能,你可以負擔得起一分錢一分錢,然後在顯示時間結果。 –

1

這樣便接踵而來行動建議由@ d-馮,下面的Python包可以是有用的你:decimalfractions

然後,你可以做一些事情,如:

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

而且你一直沒有使用漂浮物,但有理數。有關更多示例,請參閱文檔。

相關問題