2011-03-28 95 views
1
def isinteger(x): 
    while x > 0.0: 
     x = x - 1.0 
    if x < 0.0: 
     return 0.0 
    elif x == 0: 
     return 1.0 

d = input('') 
print isinteger(d) 

該代碼有點自我解釋。我正在使用它作爲一個fractran解釋器。這是我的問題:我輸入一個分數,例如22/7,並且我得到一個1作爲我的輸出。它與Python的IO有什麼關係?Python整數測試

+2

您可能還會考慮更有效的方法來檢查「x」是否爲整數。例如'if x%1 == 0 return 1 else return 0' – JoshAdel 2011-03-28 04:34:50

回答

5

input函數以與輸入python解釋器的方式完全相同的方式評估你的22/7。由於22和7都是整數,所以得到的整數除法結果爲3.如果要進行浮點除法,請輸入22.0/722/7.0,這兩者都會導致3.146...

2

如果您使用的是python 2,輸入「22/7」會直接導致整數除法,即它會將輸入舍入到3,因此算法返回1.請嘗試輸入22.0/7。另外,如果您將它用於任何真實的事情,您可能會考慮更快地選擇此算法。可能性:

def isinteger(x): 
    return int(x) == x 

def isinteger(x): 
    return isinstance(x, int) 
+0

哦!謝謝! 無論如何有22/7被視爲22.0/7.0?對於fractran,你必須寫很多分數,所以它會減少麻煩。 – 2011-03-28 04:30:34

+0

如果您使用python 3而不是python 2,它會自動執行浮點除法,因此22/7被視爲22.0/7.0(整數除法需要用22 // 7強制)。我不知道你怎麼能在python 2中做到這一點。 – Sean 2011-03-28 04:32:50

+2

在python 2中,你可以把'from __future__ import division'放在程序的頂部 – deprecated 2011-03-28 04:35:48

2

22.0/7 VS 22/7之外,還有就是這種方法的另一個問題:它不會在大多數編程語言的工作,因爲the way floating point numbers are represented。例如,使用原來的功能:

In [37]: isinteger(190.000000000000000001) 
Out[37]: 1.0 

使用Sean的int(x) == x建議:

In [39]: x = 190.000000000000000001 
In [40]: int(x) == x 
Out[40]: True 

我意識到它不能直接解決的問題,但我希望它會阻止未來的一個:)

+0

這種方法沒有問題 - ''''*是一個整數。由於四捨五入,「190.000000000000000001 == 190」。沒有算法會給出任何其他答案,因爲輸入簡直就是190. – 2011-03-28 05:13:54

+0

@Glenn Maynard:'這種方法'我的意思是高級別:'寫一個解釋器,試圖處理浮點值,特別是使用'=='檢查'而不是使用類型標籤。目前還不清楚「isinteger」檢查的意圖是什麼,所以我認爲值得指出。 – phooji 2011-03-28 05:21:01

1

如果你想檢查整數例如尋找大的完美平方,你必須考慮二進制表示的不準確性(絕對不需要正數,但需要負數):

x = -190.00000000001 
print int(x) == x 

epsilon = 1E-10 

def isinteger(n): 
    " near enoungh to pass as integer considering round of errors " 
    return abs(n-int(n)) < epsilon 

print isinteger(x) 

隱含的Python2的eval被認爲是安全的。如果你想輸入數字,而不是讓用戶去提供任何公式(和在任何情況下,你需要加試...除了用於處理用戶輸入):

number = raw_input('Give number: ') 
number = int(number) if all(c.isdigit() for c in number) else float(number) 
print number 
0

您的輸入都是整數,因此結果在給3作爲輸入,從而它產生1作爲輸出。