【问题标题】:Check if a number is int or float检查数字是 int 还是 float
【发布时间】:2011-05-31 06:44:58
【问题描述】:

我是这样做的:

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

类似的东西。
有没有更好看的方法来做到这一点?

【问题讨论】:

  • 诀窍是在 SO 上搜索该问题的所有其他时间。每一个都将提供相同的标准答案的重复。
  • @Wooble:larger numbers 失败。
  • assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber) 是我在 Google 发现这个问题时所寻找的。​​span>
  • 问题不是特别好。 OP是否在问:1)“变量somenumber的内在Python变量类型是什么?” 2) somenumber 是一个整数吗? 3) somenumber 是一个已知表示数字的字符串,但它是表示整数还是浮点值?一些 COUNTER CASES 可以帮助受访者提出合适的解决方案。

标签: python


【解决方案1】:

使用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

【讨论】:

  • @David: issubclass 将是一个错误,因为它适用于类。 isinstance 检查给定对象是否是类的实例或该类的子类之一,因此它是完全通用的。我认为isinstance(obj, cls) 等价于issubclass(obj.__class__, cls)
  • 这不适用于其他整数类型,例如x = 12L。我知道只要求int,但在其他问题发生之前解决它们是件好事。最通用的可能是isinstance(x, numbers.Integral)
  • 对于 Python 2,还有直接复查:isinstance(x, (int, long))
  • 警告:布尔值也是整数的实例。见isinstance(True, int)
  • 最后一段不正确吗? isinstance(12, float) 为我返回 False
【解决方案2】:

我最喜欢@ninjagecko 的回答。

这也可以:

对于 Python 2.x

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

Python 3.x 没有 long

isinstance(n, (int, float))

对于复数也有 complex 类型

【讨论】:

  • 附注,因为布尔值将解析为 True(例如 isinstance(False, (int, float)) = True),我需要 not isinstance(n, bool) and isinstance(n, (int, float)) 代替
  • Lifesaver.. 我没有注意到 isinstance() 可以检查多种类型..
【解决方案3】:

(注意:对于bool 类型,这将返回True,至少在cpython 中,这可能不是您想要的。谢谢评论者。)

单线:

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

【讨论】:

  • 在 Python 3 中 isinstance(99**10,int)True
  • 这也通过了Boolinstance(True, numbers.Real)True
【解决方案4】:

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

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

【讨论】:

  • 这会在[公认的罕见]情况下失败,即所讨论的数字是 int 或 float 的 SUBCLASS。 (因此为什么“isinstance”会被认为“更好”,IMO。)
【解决方案5】:

请求宽恕比请求许可更容易。只需执行操作。如果它有效,则该对象是可接受的、合适的、适当的类型。如果操作不起作用,则该对象不是合适的类型。了解类型很少有帮助。

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

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

【讨论】:

  • typeisinstance 可以胜任这项工作,有什么理由这样做吗?
  • int(1.5) 不会引发 ValueError,而且您显然知道——故意给出错误答案?认真的吗?
  • @Glenn:我假设 S.Lott 将问题理解为“检查 string 是 int 还是 float”(在这种情况下,它实际上是一个很好的解决方案) .
  • @A A:class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int。 (抱歉语法不好,但我不能在一行上做更多。)
  • @A 答:是的。原因是这样更简单,更可靠。 intfloat 之间的区别甚至可能与许多算法无关。明确地请求类型通常是不良多态性或更严重的设计问题的标志。简而言之。不要检查类型。请求宽恕比请求许可更容易。
【解决方案6】:

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

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

【讨论】:

  • @dylnmc 然后可以使用 isinstance() 方法判断 x 是否为数字。此外,3.2% 1 产生 0.2。如果一个数能被 1 整除,那么它在数值上就是一个整数。这种方法对我很有用,尽管它可能不适合你。
  • 这是真的; x%1 == 0 应该只适用于整数(但它也适用于小数点后只有零的浮点数)。如果您知道它将是一个 int(例如,如果这是一个函数的参数),那么您可以使用模数进行检查。我敢打赌这比Math.floor(x) == x 快​​。在不太好的方面,如果您传递像 1.05.0 这样的浮点数,这将是 True,并且使用原始海报在他/她的问题中提到的内容,您将遇到同样的问题。跨度>
【解决方案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 具有 intlong 两种类型,而 Python 3 仅具有 int 类型。 Source.

如果您想检查您的号码是否是代表intfloat,请执行此操作

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

如果您不需要区分int和float,并且两者都可以,那么ninjagecko的答案就是要走的路

import numbers

isinstance(yourNumber, numbers.Real)

【讨论】:

    【解决方案8】:

    在 Python 3.6.3 Shell 版本中尝试过

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

    想不出什么可以工作。

    【讨论】:

      【解决方案9】:

      这个解决方案怎么样?

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

      【讨论】:

        【解决方案10】:

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

        它适用于 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))
        

        【讨论】:

          【解决方案11】:

          请检查:导入数字

          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是float但值是整数,所以如果你想检查值是整数你不能使用isinstance,你需要比较值而不是类型。

          【讨论】:

            【解决方案12】:

            你可以用简单的 if 语句来做到这一点

            检查浮动

            如果类型(a)==类型(1.1)

            检查整数类型

            如果类型(a)==类型(1)

            【讨论】:

              【解决方案13】:

              我不知道为什么以前没有提出这个建议,但是在一个名为 is_integer() 的浮点数上使用内置 Python 方法怎么样?基本上你可以给它一些数字作为浮点数,并询问天气它是否是整数。例如:

              >>> (-13.0).is_integer()
              True
              
              >>> (3.14).is_integer()
              False
              

              有关此方法的更多信息,请参阅https://docs.python.org/3/library/stdtypes.html#float.is_integer

              【讨论】:

              • 这是一个非常好的提议。这是一个内置功能,所以很好!它可以应用于带有 lambda 的系列。 python _df["col_to_test].apply(lambda x : x.is_integer())
              【解决方案14】:
              absolute = abs(x)
              rounded = round(absolute)
              if absolute - rounded == 0:
                print 'Integer number'
              else:
                print 'notInteger number'
              

              【讨论】:

                【解决方案15】:

                更新:试试这个

                
                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 这个解决方案怎么样?
                【解决方案16】:

                使用 python 具有的最基本的类型推断:

                >>> # Float Check
                >>> myNumber = 2.56
                >>> print(type(myNumber) == int)
                False
                >>> print(type(myNumber) == float)
                True
                >>> print(type(myNumber) == bool)
                False
                >>>
                >>> # Integer Check
                >>> myNumber = 2
                >>> print(type(myNumber) == int)
                True
                >>> print(type(myNumber) == float)
                False
                >>> print(type(myNumber) == bool)
                False
                >>>
                >>> # Boolean Check
                >>> myNumber = False
                >>> print(type(myNumber) == int)
                False
                >>> print(type(myNumber) == float)
                False
                >>> print(type(myNumber) == bool)
                True
                >>>
                

                我认为最简单、最灵活的方法

                【讨论】:

                  【解决方案17】:
                  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
                  • 请解释您的贡献为何/如何解决 OPs 问题。
                  • @Heri 他正在检查一个数字是int还是float,我定义的函数可以做到这一点,abs是一个内置的python函数,它返回数字的绝对值,round是还有一个对数字进行四舍五入的内置函数,如果我从绝对数字中减去四舍五入的数字,我得到一个零,那么这个数字是一个 int,或者它的小数位后为零
                  【解决方案18】:

                  试试这个...

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

                  【讨论】:

                    【解决方案19】:

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

                     if myVariable.isnumeric:
                        print('this varibale is numeric')
                     else:
                        print('not numeric')
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-11-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-09-03
                      相关资源
                      最近更新 更多