2011-03-28 35 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作为输出。