2009-10-25 59 views
1

我正在寫一個函數從數字中提取小數點。忽略異常及其語法,我正在使用2.5.2(默認Leopard版本)。我的功能還沒有處理0的。我的問題是,該函數會產生一定數量的隨機錯誤,我不明白原因。代碼後我會發布錯誤讀數。從Python中的數字中提取小數點


功能:

def extractDecimals(num): 
    try: 
     if(num > int(num)): 
      decimals = num - int(num) 
      while(decimals > int(decimals)): 
       print 'decimal: ' + str(decimals) 
       print 'int: ' + str(int(decimals)) 
       decimals *= 10 
      decimals = int(decimals) 
      return decimals 
     else: 
      raise DecimalError(num) 
    except DecimalError, e: 
     e.printErrorMessage() 


異常類:

class DecimalError(Exception): 
    def __init__(self, value): 
     self.value = value 

    def printErrorMessage(self): 
     print 'The number, ' + str(self.value) + ', is not a decimal.' 


這裏是誤差輸出WH恩我輸入數字1.988:
decimal: 0.988
int: 0
decimal: 9.88
int: 9
decimal: 98.8
int: 98
decimal: 988.0
int: 987
decimal: 9880.0
int: 9879
decimal: 98800.0
int: 98799
decimal: 988000.0
int: 987999
decimal: 9880000.0
int: 9879999
decimal: 98800000.0
int: 98799999
decimal: 988000000.0
int: 987999999
decimal: 9880000000.0
int: 9879999999
decimal: 98800000000.0
int: 98799999999
decimal: 988000000000.0
int: 987999999999
decimal: 9.88e+12
int: 9879999999999
decimal: 9.88e+13
int: 98799999999999
decimal: 9.88e+14
int: 987999999999999
9879999999999998



我不知道爲什麼這個錯誤被彈出。希望你們能幫助我。

回答

5

問題是(二進制)浮點數不能精確地表示爲小數。有關更多信息,請參閱Why can't decimal numbers be represented exactly in binary?

+0

感謝所有人的幫助。正如你們所指出的那樣,我可以更好地完成這個項目,但是我對結果並不感興趣,並且對我一路上學到的東西更感興趣。這就是爲什麼我不使用Python的所有內置功能的原因之一。感謝您的答案。 – dbmikus 2009-10-25 16:25:15

1

正如Ned Batchelder所說,並非所有的小數都可以完全表示爲浮點數。浮點數用一定數量的二進制數字表示,用於儘可能接近小數點。你永遠不能假定浮點數正好等於小數點。

In [49]: num 
Out[49]: 1.988 

In [50]: decimals=num - int(num) 

In [51]: decimals 
Out[51]: 0.98799999999999999 

In [52]: print decimals # Notice that print rounds the result, masking the inaccuracy. 
0.988 

有關浮點二進制表示的更多信息,請參閱http://en.wikipedia.org/wiki/Floating_point

還有其他方法可以實現您的目標。這裏有一種方法,使用字符串操作:

def extractDecimals(num): 
    try: 
     numstr=str(num) 
     return int(numstr[numstr.find('.')+1:]) 
    except ValueError, e: 
     print 'The number, %s is not a decimal.'%num 
0

正如其他人在他們的回答說,算術花車並不總是導致你期望由於舍入誤差。在這種情況下,可能將float轉換爲字符串並返回更好?

In [1]: num = 1.988 

In [2]: num_str = str(num) 

In [3]: decimal = num_str.split('.')[1] 

In [4]: decimal = int(decimal) 

In [5]: decimal 
Out[5]: 988 
1

正如其他人已經指出,你所看到的問題是由於浮點數

的不精確表示

與Python的Decimal

from decimal import Decimal 
extractDecimals(Decimal("0.988")) 
1

試試你的程序前面已經說,浮點數不完全等於小數。你可以通過使用如下的模數運算符來看到這一點:

>>> 0.988 % 1 
0.98799999999999999 
>>> 9.88 % 1 
0.88000000000000078 
>>> 98.8 % 1 
0.79999999999999716 

這給出除以1的餘數或小數。

相關問題