Compruebe si un número es int o flotante

200

Así es como lo hice:

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

Algo como eso.
¿Hay alguna forma más bonita de hacer esto?

Steinthor.palsson
fuente
44
El truco es buscar en SO todas las otras veces que se hizo esta pregunta. Cada uno de ellos proporcionará una repetición de la misma respuesta estándar.
S.Lott
1
... ¿Y por qué necesitas saberlo?
Karl Knechtel
@Wooble: falla para números más grandes .
jfs
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)era lo que estaba buscando cuando encontré esta pregunta con Google.
Martin Thoma

Respuestas:

285

El uso es instancia .

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

Entonces:

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

x is a int!

_EDITAR:_

Como se señaló, en el caso de los enteros largos, lo anterior no funcionará. Entonces debes hacer:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
usuario225312
fuente
no issubclasssería más genérico?
David Heffernan
3
@David: issubclasssería un error, ya que funciona en clases. isinstancecomprueba si un objeto dado es una instancia de una clase o una de las subclases de esa clase , por lo que es perfectamente genérico. isinstance(obj, cls)issubclass(obj.__class__, cls)
77
Esto no funciona para otros tipos enteros, por ejemplo, si x = 12L. Sé que solo intse le pidió, pero es bueno solucionar otros problemas antes de que sucedan. El más genérico es probablemente isinstance(x, numbers.Integral).
Scott Griffiths
9
Para Python 2, también existe la doble verificación directa: isinstance(x, (int, long)).
Eric O Lebigot
1
ADVERTENCIA: los bools son instancias de enteros también. Verisinstance(True, int)
jtschoonhoven
95

Me gusta más la respuesta de @ ninjagecko.

Esto también funcionaría:

para Python 2.x

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

Python 3.x no tiene mucho tiempo

isinstance(n, (int, float))

También hay un tipo complejo para números complejos

Dan H
fuente
Una nota al margen, ya que los booleanos se resolverán en Verdadero (por ejemplo isinstance(False, (int, float)) = True), necesitaba en su not isinstance(n, bool) and isinstance(n, (int, float))lugar
YTZ
54

Un trazador de líneas:

isinstance(yourNumber, numbers.Real)

Esto evita algunos problemas:

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

Manifestación:

>>> import numbers

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

>>> isinstance(someInt, numbers.Real)
True
>>> isinstance(someLongInt, numbers.Real)
True
>>> isinstance(someFloat, numbers.Real)
True
ninjagecko
fuente
66
En Python 3 isinstance(99**10,int)es True.
Carlos A. Gómez
12

Es más fácil pedir perdón que pedir permiso. Simplemente realice la operación. Si funciona, el objeto era de un tipo aceptable, adecuado y adecuado. Si la operación no funciona, el objeto no era del tipo adecuado. Conocer el tipo rara vez ayuda.

Simplemente intente la operación y vea si funciona.

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
S.Lott
fuente
55
¿Hay alguna razón para hacer esto cuando typey isinstancepuede hacer el trabajo?
user225312
9
int (1.5) no aumenta ValueError, y obviamente lo sabes, ¿dar una respuesta incorrecta a propósito? ¿Seriamente?
Glenn Maynard
44
@Glenn: Supongo que S.Lott entendió la pregunta como "verificar si una cadena es int o flotante" (en cuyo caso, en realidad sería una buena solución).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Perdón por la mala sintaxis, pero no puedo hacer más en una línea.)
mg.
2
@AA: Sí La razón es que esto es más simple y más confiable. La distinción entre inty floatpuede incluso no ser relevante para muchos algoritmos. Solicitar el tipo explícitamente suele ser un signo de mal polimorfismo o un problema de diseño aún más grave. En breve. No verifique los tipos. Es más fácil pedir perdón que pedir permiso.
S.Lott
10

Lo que también puedes hacer es usar el type() Ejemplo:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
usuario274595
fuente
1
Esto fallaría en el caso [ciertamente raro] de que el número en cuestión sea una SUBCLASE de int o float. (Por eso, "isinstance" se consideraría "mejor", OMI.)
Dan H
7

Aquí hay un código que verifica si un número es un número entero o no, funciona tanto para Python 2 como para 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

Tenga en cuenta que Python 2 tiene ambos tipos inty long, mientras que Python 3 solo tiene tipo int. Fuente .

Si desea verificar si su número es un floatque representa un int, haga esto

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

Si no necesita distinguir entre int y float, y está bien con cualquiera de ellos, entonces la respuesta de ninjagecko es el camino a seguir

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
fuente
6

¿Qué tal esta solución?

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

Sé que es un hilo viejo, pero esto es algo que estoy usando y pensé que podría ayudar.

Funciona en python 2.7 y 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))
Shahar
fuente
5

Puede usar el módulo para determinar si x es un número entero numéricamente. El isinstance(x, int)método solo determina si x es un número entero por tipo:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
William Gerecke
fuente
3.2 % 2rendimientos 1.4. ¿Qué talkin '' pelea, Willi (s | am)? Además, para empezar, obtendrá un TypeErrorsi x no es un número, por lo que su programa se cerraría prematuramente si seguía este consejo ...
dylnmc
@dylnmc Entonces puede usar el método isinstance () para determinar si x es un número. Además, 3.2% 1 rinde 0.2. Si un número es divisible por 1, es un número entero numéricamente. Este método fue útil para mí aunque no haya sido para ti.
William Gerecke
Esto es verdad; x%1 == 0debe ser cierto solo para ints (pero también será cierto para flotantes con solo un cero después del punto decimal). Si sabe que va a ser un int (p. Ej., Si se trata de un parámetro de una función), puede verificar con el módulo. Apuesto a que es más rápido que Math.floor(x) == x. En el lado no tan brillante, esto será Truesi pasas un flotador como 1.0o 5.0, y encontrarás el mismo problema usando lo que el cartel original mencionó en su pregunta.
dylnmc
5

Probado en Python versión 3.6.3 Shell

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

No se pudo encontrar nada para trabajar.

ella
fuente
4

por favor verifique esto: números de importación

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

Aunque X es flotante, pero el valor es entero, por lo tanto, si desea verificar que el valor sea entero, no puede usar isinstance y necesita comparar valores, no tipos.

M.Hefny
fuente
1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'
Ajay Prajapati
fuente
0

Actualización: prueba esto


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)
Magotte
fuente
Sí, lo hice y no funcionó. Y estoy bastante seguro de que realmente no lo intentaste. Porque no funciona
JJJ
Ciertamente, hay una forma menos ofensiva de responder. Aunque tienes razón, acabo de hacer más pruebas, no funciona en todos los casos.
Magotte
@JJJ ¿Qué tal esta solución?
Magotte
0

Puedes hacerlo con una simple declaración if

Para verificar el flotador

si tipo (a) == tipo (1.1)

Para verificar el tipo entero

si tipo (a) == tipo (1)

Alwyn Miranda
fuente
-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
Gedeón Lytes
fuente
func busca entradas pero también devuelve verdadero para flotadores que son .0
Gideon Lytes
Explique por qué / cómo su contribución resuelve la pregunta de los OP.
Heri
@Heri está buscando verificar si un número es un int o un flotante, la función que definí puede hacer eso, abs es una función de Python incorporada que devuelve el valor absoluto del número, round también es una función incorporada que completa el número, si resta el número redondeado del número absoluto, y obtengo un cero, entonces el número es un int, o tiene un cero como después de sus lugares decimales
Gideon Lytes
-1

Prueba esto...

def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  return absolute - rounded == 0
Ramkumar G
fuente
-5

variable.isnumeric comprueba si un valor es un entero:

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