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?

Steinthor.palsson
fonte
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
user225312
fonte
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

Dan H
fonte
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
ninjagecko
fonte
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
S.Lott
fonte
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"
user274595
fonte
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)
Agostino
fonte
6

que tal esta solução?

if type(x) in (float, int):
    # do whatever
else:
    # do whatever
Cracóvia
fonte
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))
Shahar
fonte
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"
William Gerecke
fonte
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.

ella
fonte
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.

M.Hefny
fonte
1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'
Ajay Prajapati
fonte
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)
Magotte
fonte
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)

Alwyn Miranda
fonte
-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
Gideon Lytes
fonte
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
Ramkumar G
fonte
-5

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

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