2009-08-23 36 views
60

我正在做一個程序,由於不需要解釋的原因,需要一個浮點數轉換成一個字符串來計算len()。但是,str(float(x))導致x在被轉換爲一個字符串時被四捨五入,從而拋出整個事情。有誰知道它的修復? 這裏,如果你想知道所使用的代碼:浮動轉換爲一個字符串,而不捨入它

len(str(float(x)/3)) 
+2

如果x原本海峽,爲何投? – 2009-08-23 02:11:14

+1

-1:沒有示例爲'x'的不同值所需的輸出。沒有例子,我們只能猜測問題是什麼。 – 2009-08-23 12:31:37

回答

92

舍入的一些形式浮點數打交道時常常是不可避免的。這是因爲您可以精確地以10爲底數表示的數字不能總是以2爲底(您的計算機使用的)來表示。

例如:

>>> .1 
0.10000000000000001 

在這種情況下,你使用repr看到0.1轉換爲字符串:

>>> repr(.1) 
'0.10000000000000001' 

我相信蟒蛇砍掉最後的幾個數字當您使用str()爲了解決這個問題,但這是一個部分的解決方法,並不能代替理解正在發生的事情。

>>> str(.1) 
'0.1' 

我不確定到底是什麼問題導致你「四捨五入」。也許你會更好地使用字符串格式來更精確地控制輸出?

例如

>>> '%.5f' % .1 
'0.10000' 
>>> '%.5f' % .12345678 
'0.12346' 

Documentation here

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

但是我必須說,這並不像你想象的那麼可靠。

浮動數據以十進制數字形式輸入/顯示,但您的計算機(實際上是您的標準C庫)將它們存儲爲二進制數據。您可以從這種轉變得到一些副作用:

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

上之所以出現這種情況的解釋是在Python教程this chapter

的溶液是使用特異性跟蹤十進制數,像python的decimal.Decimal類型:

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

十進制+1。 – 2009-08-23 10:43:40

+0

關於如何使用除法浮點結果的好帖子:https://stackoverflow.com/questions/2958684/python-division – Trutane 2017-09-01 23:17:27

3

其他答案已經指出,浮點數的表示是一個棘手的問題,至少可以說。

既然你不給你的問題夠背景下,我不知道如果小數點模塊能夠滿足您的需求是有用的:

http://docs.python.org/library/decimal.html

在其他的東西,你可以明確地指定精度你希望獲得(從文檔):

>>> getcontext().prec = 6 
>>> Decimal('3.0') 
Decimal('3.0') 
>>> Decimal('3.1415926535') 
Decimal('3.1415926535') 
>>> Decimal('3.1415926535') + Decimal('2.7182818285') 
Decimal('5.85987') 
>>> getcontext().rounding = ROUND_UP 
>>> Decimal('3.1415926535') + Decimal('2.7182818285') 
Decimal('5.85988') 

一個簡單的例子從我的提示(蟒蛇2。6):

>>> import decimal 
>>> a = decimal.Decimal('10.000000001') 
>>> a 
Decimal('10.000000001') 
>>> print a 
10.000000001 
>>> b = decimal.Decimal('10.00000000000000000000000000900000002') 
>>> print b 
10.00000000000000000000000000900000002 
>>> print str(b) 
10.00000000000000000000000000900000002 
>>> len(str(b/decimal.Decimal('3.0'))) 
29 

也許這可以幫到您? 十進制是自2.4以來的python stdlib,並在python 2.6中添加。

希望這有助於 弗朗切斯科