检查数字是否为int或float


199

这是我的做法:

inNumber = somenumber
inNumberint = int(inNumber)
if inNumber == inNumberint:
    print "this number is an int"
else:
    print "this number is a float"

这样的事情。
有没有更好的方法可以做到这一点?


4
诀窍是在所有其他情况下都在SO上搜索此问题。每一个都会提供相同的标准答案的重复。
S.Lott

1
...为什么您需要知道?
Karl Knechtel 2010年


@Wooble:对于较大的数字,它失败。
jfs 2014年

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)是我在Google上发现这个问题时要寻找的东西。
马丁·托马

Answers:


283

使用isinstance

>>> x = 12
>>> isinstance(x, int)
True
>>> y = 12.0
>>> isinstance(y, float)
True

所以:

>>> if isinstance(x, int):
        print 'x is a int!'

x is a int!

_编辑:_

如前所述,在长整数的情况下,上述方法不起作用。因此,您需要执行以下操作:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False

不会issubclass更通用吗?
David Heffernan 2010年

3
@David:issubclass这将是一个错误,因为它适用于类。isinstance检查给定对象是一个类的实例还是该类的子类之一,因此它是完全通用的。依我看这isinstance(obj, cls)相当于issubclass(obj.__class__, cls)

7
这不适用于其他整数类型,例如if x = 12L。我知道只int要求这样做,但是很高兴在其他问题发生之前将其修复。最通用的可能是isinstance(x, numbers.Integral)
Scott Griffiths

9
对于Python 2,还有直接的双重检查:isinstance(x, (int, long))
Eric O Lebigot

1
警告:布尔值也是整数的实例。请参阅isinstance(True, int)
jtschoonhoven

93

我最喜欢@ninjagecko的回答。

这也将起作用:

对于Python 2.x

isinstance(n, (int, long, float)) 

Python 3.x时间不

isinstance(n, (int, float))

对于复数也有复数类型


阿里纳斯,因为布尔将解析为True(例如isinstance(False, (int, float)) = True),我需要not isinstance(n, bool) and isinstance(n, (int, float))代替
YTZ

54

单线:

isinstance(yourNumber, numbers.Real)

这样可以避免一些问题:

>>> isinstance(99**10,int)
False

演示:

>>> import numbers

>>> someInt = 10
>>> someLongInt = 100000L
>>> someFloat = 0.5

>>> isinstance(someInt, numbers.Real)
True
>>> isinstance(someLongInt, numbers.Real)
True
>>> isinstance(someFloat, numbers.Real)
True

6
在Python 3中isinstance(99**10,int)True
卡洛斯·A·戈麦斯

12

要求宽恕比要求许可容易。只需执行操作即可。如果可行,则该对象属于可接受的,合适的适当类型。如果该操作无效,则该对象不是适当的类型。知道类型很少有帮助。

只需尝试该操作,看看它是否有效。

inNumber = somenumber
try:
    inNumberint = int(inNumber)
    print "this number is an int"
except ValueError:
    pass
try:
    inNumberfloat = float(inNumber)
    print "this number is a float"
except ValueError:
    pass

5
没有任何理由这样做的时候type,并isinstance能胜任这项工作?
user225312 2010年

9
int(1.5)不会引发ValueError,并且您显然知道-故意给出错误的答案吗?认真吗
格伦·梅纳德

4
@Glenn:我假设S.Lott将问题理解为“检查字符串是int还是float”(在这种情况下,这实际上是一个很好的解决方案)。

@AA :class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int。(对不起,语法不好,但是我不能在一行上做更多。)
mg。

2
@AA:是的。原因是这更简单,更可靠。int和之间的区别float可能与许多算法都不相关。显式地请求类型通常是不良多态性的标志,或者甚至是更严重的设计问题。简而言之。不要检查类型。提出宽容要比征求许可容易。
S.Lott 2010年

10

您也可以使用type() 示例:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"

1
在有问题的数字是int或float的SUBCLASS的情况下,(在极少数情况下)这将失败。(因此,IMO为什么将“实例”视为“更好”。)
Dan H

7

这是一段检查数字是否为整数的代码,它适用于Python 2和Python 3。

import sys

if sys.version < '3':
    integer_types = (int, long,)
else:
    integer_types = (int,)

isinstance(yourNumber, integer_types)  # returns True if it's an integer
isinstance(yourNumber, float)  # returns True if it's a float

请注意,Python 2具有int和的两种类型long,而Python 3仅具有和的类型int来源

如果要检查您的数字是否为float代表的数字int,请执行此操作

(isinstance(yourNumber, float) and (yourNumber).is_integer())  # True for 3.0

如果您不需要区分int和float,并且都可以,那么ninjagecko的答案就是解决方法

import numbers

isinstance(yourNumber, numbers.Real)

6

这个解决方案怎么样?

if type(x) in (float, int):
    # do whatever
else:
    # do whatever

6

我知道这是一个旧线程,但这是我正在使用的东西,我认为这可能会有所帮助。

它适用于python 2.7和python 3 <。

def is_float(num):
    """
    Checks whether a number is float or integer

    Args:
        num(float or int): The number to check

    Returns:
        True if the number is float
    """
    return not (float(num)).is_integer()


class TestIsFloat(unittest.TestCase):
    def test_float(self):
        self.assertTrue(is_float(2.2))

    def test_int(self):
        self.assertFalse(is_float(2))

5

您可以使用模来确定x是否为整数。该isinstance(x, int)方法仅按类型确定x是否为整数:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"

3.2 % 2产量1.4。Whatchu talkin'回合,Willi(s | am)?另外,TypeError如果x不是以数字开头的数字,您将得到一个a,因此,如果您遵循此建议,则程序将过早退出...
dylnmc

@dylnmc然后可以使用isinstance()方法确定x是否为数字。同样,3.2%1的产量为0.2。如果一个数字可以被1整除,则它是一个整数。这种方法对我很有用,即使它可能不适合您。
William Gerecke

这是真的; x%1 == 0仅对于整数应该为true(但对于仅在小数点后为零的浮点数也应如此)。如果您知道它将是一个int类型(例如,如果这是一个函数的参数),则可以使用模进行检查。我敢打赌,这比Math.floor(x) == x。在不太明亮的一面,这将是True如果您通过像1.0或的浮点数5.0,并且使用他/她的问题中提到的原始海报会遇到相同的问题。
dylnmc

5

在Python 3.6.3 Shell中试用

>>> x = 12
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x,int)
True

无法解决任何工作。


4

请检查一下:进口号码

import math

a = 1.1 - 0.1
print a 

print isinstance(a, numbers.Integral)
print math.floor( a )
if (math.floor( a ) == a):
    print "It is an integer number"
else:
    print False

尽管X是浮点型,但值是整数,所以如果要检查值是整数,则不能使用isinstance,并且需要比较值而不是类型。



0

更新:试试这个


inNumber = [32, 12.5, 'e', 82, 52, 92, '1224.5', '12,53',
            10000.000, '10,000459', 
           'This is a sentance, with comma number 1 and dot.', '121.124']

try:

    def find_float(num):
        num = num.split('.')
        if num[-1] is not None and num[-1].isdigit():
            return True
        else:
            return False

    for i in inNumber:
        i = str(i).replace(',', '.')
        if '.' in i and find_float(i):
            print('This is float', i)
        elif i.isnumeric():
            print('This is an integer', i)
        else:
            print('This is not a number ?', i)

except Exception as err:
    print(err)

是的,我做到了,但没有成功。而且我很确定您没有真正尝试过。因为它不起作用。
JJJ

当然,有一种反感较小的应对方式。尽管您是对的,但我只是进行了更多测试,因此并非在每种情况下都有效。
Magotte

@JJJ这个解决方案怎么样?
Magotte


-1
def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  if absolute - rounded == 0:
    print str(x) + " is an integer"
  else:
    print str(x) +" is not an integer"


is_int(7.0) # will print 7.0 is an integer

func检查整数,但对于.0的浮点数也返回true
Gideon Lytes

请说明您的贡献为何/如何解决运营问题。
Heri

@Heri他正在寻找一个数字是int还是float,我定义的函数可以做到这一点,abs是一个内置的python func,它返回数字的绝对值,round也是一个内置的func,可以将整数取整。数字,如果我从绝对的1减去四舍五入的数字,然后得到零,则该数字为整数,或者在小数点后为零
Gideon Lytes

-1

试试这个...

def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  return absolute - rounded == 0

-5

variable.isnumeric 检查值是否为整数:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.