Controlla se un numero è int o float


200

Ecco come l'ho fatto:

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

Qualcosa del genere.
Ci sono modi più belli per farlo?


4
Il trucco è cercare su SO tutte le altre volte che questa domanda è stata posta. Ognuno di questi fornirà una ripetizione della stessa risposta standard.
S.Lott

1
... E perché devi saperlo?
Karl Knechtel,


@Wooble: fallisce per numeri più grandi .
jfs,

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)era quello che stavo cercando quando ho trovato questa domanda con Google.
Martin Thoma,

Risposte:


285

Usa isinstance .

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

Così:

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

x is a int!

_MODIFICARE:_

Come sottolineato, in caso di numeri interi lunghi, quanto sopra non funzionerà. Quindi devi fare:

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

non issubclasssarebbe più generico?
David Heffernan,

3
@David: issubclasssarebbe un errore, poiché funziona sulle classi. isinstancecontrolla se un determinato oggetto è un'istanza di una classe o una delle sottoclassi di quella classe , quindi è perfettamente generico. Pensa che isinstance(obj, cls)sia equivalente aissubclass(obj.__class__, cls)

7
Questo non funziona per altri tipi di numeri interi, ad esempio se x = 12L. So solo che è intstato chiesto, ma è bello risolvere altri problemi prima che si verifichino. Il più generico è probabilmente isinstance(x, numbers.Integral).
Scott Griffiths,

9
Per Python 2, v'è anche il doppio controllo diretta: isinstance(x, (int, long)).
Eric O Lebigot,

1
ATTENZIONE: i bool sono anche istanze di numeri interi. Vediisinstance(True, int)
jtschoonhoven il

95

Mi piace di più la risposta di @ ninjagecko.

Questo funzionerebbe anche:

per Python 2.x

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

Python 3.x non ha molto tempo

isinstance(n, (int, float))

esiste anche un tipo complesso per numeri complessi


Un sidenote, perché i booleani si risolveranno in True (ad es. isinstance(False, (int, float)) = True), not isinstance(n, bool) and isinstance(n, (int, float))Invece avevo bisogno
YTZ

54

One-liner:

isinstance(yourNumber, numbers.Real)

Questo evita alcuni problemi:

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

12

È più facile chiedere perdono che chiedere l'autorizzazione. Basta eseguire l'operazione. Se funziona, l'oggetto era di un tipo accettabile, adatto e corretto. Se l'operazione non funziona, l'oggetto non era di tipo adatto. Conoscere il tipo raramente aiuta.

Basta provare l'operazione e vedere se funziona.

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
C'è qualche motivo per farlo quando typee isinstancepuò fare il lavoro?
user225312

9
int (1.5) non aumenta ValueError, e ovviamente lo sai - dare una risposta sbagliata di proposito? Sul serio?
Glenn Maynard,

4
@Glenn: suppongo che S.Lott abbia capito la domanda come "controlla se una stringa è un int o float" (nel qual caso sarebbe effettivamente una buona soluzione).

@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Mi dispiace per la sintassi sbagliata ma non posso fare di più su una riga.)
mg.

2
@AA: Sì. Il motivo è che questo è più semplice e più affidabile. La distinzione tra inte floatpotrebbe non essere nemmeno rilevante per molti algoritmi. Richiedere esplicitamente il tipo è di solito un segno di cattivo polimorfismo o un problema di progettazione ancora più grave. In breve. Non controllare i tipi. È più facile chiedere perdono che chiedere l'autorizzazione.
S.Lott

10

Anche quello che puoi fare è usare type() Esempio:

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

1
Ciò fallirebbe nel caso [certamente raro] che il numero in questione sia un SUBCLASS di int o float. (Da qui il motivo per cui "isinstance" sarebbe considerata "migliore", IMO.)
Dan H

7

Ecco un pezzo di codice che controlla se un numero è un numero intero o meno, funziona sia per Python 2 che per 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

Notare che Python 2 ha entrambi i tipi inte long, mentre Python 3 ha solo il tipo int. Fonte .

Se vuoi verificare se il tuo numero è un floatche rappresenta un int, fallo

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

Se non hai bisogno di distinguere tra int e float e sei d'accordo con entrambi, allora la risposta di ninjagecko è la strada da percorrere

import numbers

isinstance(yourNumber, numbers.Real)

6

che ne dici di questa soluzione?

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

6

So che è un vecchio thread, ma questo è qualcosa che sto usando e ho pensato che potesse aiutare.

Funziona in 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

È possibile utilizzare il modulo per determinare se x è un numero intero numericamente. Il isinstance(x, int)metodo determina solo se x è un numero intero per tipo:

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

3.2 % 2rese 1.4. Cosa stai parlando, Willi (s | am)? Inoltre, otterrai un TypeErrorx se non è un numero per cominciare, quindi il tuo programma
uscirà

@dylnmc Quindi è possibile utilizzare il metodo isinstance () per determinare se x è un numero. Inoltre, il 3,2% 1 produce 0,2. Se un numero è uniformemente divisibile per 1, è un numero intero numericamente. Questo metodo mi è stato utile anche se potrebbe non essere stato per te.
William Gerecke,

questo è vero; x%1 == 0dovrebbe essere vero solo per gli ints (ma lo sarà anche per i float con solo uno zero dopo il punto decimale). Se sai che sarà un int (ad esempio, se si tratta di un parametro per una funzione), allora puoi semplicemente controllare con modulo. Scommetto che è più veloce di Math.floor(x) == x. Sul lato non così brillante, questo sarà Truese passi un galleggiante come 1.0o 5.0, e incontrerai lo stesso problema usando ciò che il poster originale menzionato nella sua domanda.
dylnmc,

5

Provato in Python versione 3.6.3 Shell

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

Non riuscivo a capire nulla per cui lavorare.


4

per favore controlla questo: importare numeri

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

Sebbene X sia float ma il valore è intero, quindi se si desidera verificare che il valore sia intero non è possibile utilizzare isinstance e è necessario confrontare valori non tipi.


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

0

Aggiornamento: prova questo


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)

Sì, l'ho fatto e non ha funzionato. E sono abbastanza sicuro che tu non ci abbia provato. Perché non funziona.
JJJ

Certamente, c'è un modo meno offensivo per rispondere. Anche se hai ragione, eseguo altri test, ma non funziona in ogni caso.
Magotte,

@JJJ Che ne dici di questa soluzione?
Magotte,

0

Puoi farlo con una semplice istruzione if

Per verificare la presenza di galleggiante

se tipo (a) == tipo (1.1)

Per verificare il tipo intero

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

func verifica la presenza di ints ma restituisce anche true per i float che sono .0
Gideon Lytes,

Spiegare perché / in che modo il proprio contributo risolve la domanda dei PO.
Heri,

@Heri sta cercando di verificare se un numero è un int o un float, la funzione che ho definito può farlo, abs è una funzione di pitone incorporata che restituisce il valore assoluto del numero, round è anche una funzione incorporata che completa il numero, se sottraggo il numero arrotondato da quello assoluto e ottengo uno zero, allora il numero è un int o ha uno zero come dopo le sue cifre decimali
Gideon Lytes

-1

Prova questo...

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

-5

variable.isnumeric controlla se un valore è un numero intero:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.