Verifique se um número é int ou float


200

Aqui está como eu fiz isso:

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

Algo parecido.
Existem maneiras mais agradáveis ​​de fazer isso?


4
O truque é procurar no SO todas as outras vezes em que essa pergunta foi feita. Cada um deles fornecerá uma repetição da mesma resposta padrão.
S.Lott

1
... E por que você precisa saber?
precisa


@ Wooble: falha para números maiores .
jfs

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber) era o que eu procurava quando encontrei essa pergunta no Google.
Martin Thoma 28/03

Respostas:


285

Use uma instância .

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

Assim:

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

x is a int!

_EDITAR:_

Como apontado, no caso de números inteiros longos, o acima não funcionará. Então você precisa fazer:

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

não issubclassseria mais genérico?
David Heffernan

3
@ David: issubclassseria um erro, pois funciona em classes. isinstanceverifica se um determinado objeto é uma instância de uma classe ou uma das subclasses dessa classe , portanto é perfeitamente genérico. Parece-me que isinstance(obj, cls)é equivalente aissubclass(obj.__class__, cls)

7
Isso não funciona para outros tipos inteiros, por exemplo, se x = 12L. Eu sei que apenas intfoi solicitado, mas é bom corrigir outros problemas antes que eles aconteçam. O mais genérico é provavelmente isinstance(x, numbers.Integral).
Scott Griffiths

9
Para Python 2, há também a dupla verificação direta: isinstance(x, (int, long)).
Eric O Lebigot

1
AVISO: bools também são instâncias de números inteiros. Vejaisinstance(True, int)
jtschoonhoven

95

Eu gosto mais da resposta do @ ninjagecko.

Isso também funcionaria:

para Python 2.x

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

Python 3.x não tem muito tempo

isinstance(n, (int, float))

também há complexo de tipos para números complexos


Uma nota de rodapé, porque os booleanos resolverão como True (por exemplo isinstance(False, (int, float)) = True), eu precisava not isinstance(n, bool) and isinstance(n, (int, float))disso
YTZ

54

Uma linha:

isinstance(yourNumber, numbers.Real)

Isso evita alguns problemas:

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

Demo:

>>> 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
Em Python 3 isinstance(99**10,int)é True.
Carlos A. Gómez

12

É mais fácil pedir perdão do que pedir permissão. Simplesmente execute a operação. Se funcionar, o objeto era de um tipo aceitável, adequado e adequado. Se a operação não funcionar, o objeto não era do tipo adequado. Conhecer o tipo raramente ajuda.

Simplesmente tente a operação e veja se 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

5
Existe alguma razão para fazer isso quando typee isinstancepode fazer o trabalho?
user225312

9
int (1.5) não gera ValueError, e você obviamente sabe disso - dando uma resposta errada de propósito? Seriamente?
Glenn Maynard

4
@ Glenn: Presumo que S.Lott entendeu a pergunta como "verifique se uma string é int ou float" (nesse caso, seria realmente uma boa solução).

@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Desculpe pela sintaxe ruim, mas não posso fazer mais em uma linha.)
mg.

2
@AA: Sim. A razão é que isso é mais simples e mais confiável. A distinção entre inte floatpode até não ser relevante para muitos algoritmos. Solicitar explicitamente o tipo geralmente é um sinal de polimorfismo ruim ou um problema de design ainda mais sério. Em resumo. Não verifique os tipos. É mais fácil pedir perdão do que pedir permissão.
S.Lott

10

O que você também pode fazer é usar o type() Exemplo:

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

1
Isso falharia no caso [reconhecidamente raro] de que o número em questão seja um SUBCLASS de int ou float. (Daí por que "isinstance" seria considerado "melhor", IMO.)
Dan H

7

Aqui está um pedaço de código que verifica se um número é um número inteiro ou não; ele funciona tanto para o Python 2 quanto para o 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

Observe que o Python 2 possui dois tipos inte long, enquanto o Python 3 possui apenas o tipo int. Fonte .

Se você deseja verificar se o seu número é um floatque representa um int, faça isso

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

Se você não precisa distinguir entre int e float, e está bem com qualquer um deles, então a resposta de ninjagecko é o caminho a percorrer

import numbers

isinstance(yourNumber, numbers.Real)

6

que tal esta solução?

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

6

Eu sei que é um tópico antigo, mas isso é algo que estou usando e achei que poderia ajudar.

Funciona em python 2.7 e 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

Você pode usar o módulo para determinar se x é um número inteiro numericamente. O isinstance(x, int)método determina apenas se x é um número inteiro por tipo:

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

3.2 % 2rendimentos 1.4. O que você está falando, Willi? Além disso, você vai ter um TypeErrorcaso x não é um número para começar, para que o seu programa iria sair prematuramente se você seguiu este conselho ...
dylnmc

@dylnmc Então você pode usar o método isinstance () para determinar se x é um número. Além disso, 3,2% 1 produz 0,2. Se um número é igualmente divisível por 1, é um número inteiro numericamente. Esse método foi útil para mim, mesmo que não tenha sido para você.
William Gerecke

isso é verdade; x%1 == 0deve ser verdadeiro apenas para ints (mas também será verdadeiro para flutuadores com apenas um zero após o ponto decimal). Se você sabe que vai ser um int (por exemplo, se este é um parâmetro para uma função), então você pode apenas verificar com o módulo. Aposto que é mais rápido que Math.floor(x) == x. No lado não tão brilhante, isso acontecerá Truese você passar por um carro alegórico como 1.0ou 5.0, e você encontrará o mesmo problema usando o que o pôster original mencionou em sua pergunta.
dylnmc

5

Tentei no Python versão 3.6.3 Shell

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

Não foi possível descobrir nada para trabalhar.


4

pls verifique isto: números de importação

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

Embora X seja flutuante, mas o valor seja inteiro, portanto, se você quiser verificar se o valor é inteiro, não poderá usar isinstance e precisará comparar valores e não tipos.


1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'

0

Atualização: tente isso


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)

Sim, eu fiz e não funcionou. E tenho certeza que você realmente não tentou. Porque isso não funciona.
JJJ 21/06

Certamente, há uma maneira menos ofensiva de responder. Embora você esteja certo, eu apenas executei mais testes, mas não funciona em todos os casos.
Magotte 21/06/19

@JJJ Que tal esta solução?
precisa saber é

0

Você pode fazer isso com uma instrução if simples

Para verificar se há flutuador

se tipo (a) == tipo (1.1)

Para verificar o tipo inteiro

se tipo (a) == tipo (1)


-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

cheques func para ints, mas também retorna true para carros alegóricos que são 0,0
Gideon Lytes

Explique por que / como sua contribuição resolve a questão dos POs.
Heri

@Heri ele está olhando para verificar se um número é int ou float, a função que eu defini pode fazer isso, abs é uma função python embutida que retorna o valor absoluto do número, round também é uma função embutida que completa o número, se subtrair o número arredondado do absoluto e obter um zero, então o número é um int, ou ele tem um zero como após suas casas decimais
Gideon Lytes

-1

Tente isso ...

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

-5

variable.isnumeric verifica se um valor é um número inteiro:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.