Überprüfen Sie, ob eine Zahl int oder float ist

199

So habe ich es gemacht:

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

Sowas in der Art.
Gibt es schönere Möglichkeiten, dies zu tun?

Steinthor.palsson
quelle
4
Der Trick besteht darin, auf SO nach allen anderen Zeiten zu suchen, zu denen diese Frage gestellt wurde. Jede dieser Antworten liefert die gleiche Standardantwort.
S.Lott
1
... und warum musst du das wissen?
Karl Knechtel
@Wooble: Bei größeren Zahlen schlägt dies fehl .
JFS
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)war das, wonach ich gesucht habe, als ich diese Frage bei Google gefunden habe.
Martin Thoma

Antworten:

283

Verwenden Sie isinstance .

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

So:

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

x is a int!

_BEARBEITEN:_

Wie bereits erwähnt, funktioniert das oben genannte bei langen Ganzzahlen nicht. Sie müssen also Folgendes tun:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
user225312
quelle
wäre nicht issubclassgenerischer?
David Heffernan
3
@ David: issubclasswäre ein Fehler, da es auf Klassen funktioniert. isinstanceprüft, ob ein bestimmtes Objekt eine Instanz einer Klasse oder eine der Unterklassen dieser Klasse ist , sodass es vollkommen generisch ist. Methinks, isinstance(obj, cls)die äquivalent zuissubclass(obj.__class__, cls)
7
Dies funktioniert nicht für andere Ganzzahltypen, z. B. wenn x = 12L. Ich weiß, dass nur intgefragt wurde, aber es ist schön, andere Probleme zu beheben, bevor sie auftreten. Das allgemeinste ist wahrscheinlich isinstance(x, numbers.Integral).
Scott Griffiths
9
Für Python 2 gibt es auch die direkte Doppelprüfung : isinstance(x, (int, long)).
Eric O Lebigot
1
WARNUNG: Bools sind auch Instanzen von Ganzzahlen. Sieheisinstance(True, int)
jtschoonhoven
93

Die Antwort von @ ninjagecko gefällt mir am besten.

Dies würde auch funktionieren:

für Python 2.x.

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

Python 3.x hat nicht lange

isinstance(n, (int, float))

Es gibt auch Typkomplex für komplexe Zahlen

Dan H.
quelle
Eine Nebenbemerkung, da Boolesche Werte in True aufgelöst werden (z. B. isinstance(False, (int, float)) = True), brauchte ich not isinstance(n, bool) and isinstance(n, (int, float))stattdessen
YTZ
54

Einzeiler:

isinstance(yourNumber, numbers.Real)

Dies vermeidet einige Probleme:

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

Es ist einfacher, um Vergebung zu bitten, als um Erlaubnis. Führen Sie einfach die Operation durch. Wenn es funktioniert, war das Objekt von einem akzeptablen, geeigneten und richtigen Typ. Wenn die Operation nicht funktioniert, war das Objekt nicht von einem geeigneten Typ. Den Typ zu kennen hilft selten.

Versuchen Sie einfach den Vorgang und prüfen Sie, ob er funktioniert.

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
quelle
5
Gibt es einen Grund, dies zu tun, wenn typeund isinstancekann die Arbeit erledigen?
user225312
9
int (1.5) löst ValueError nicht aus, und das wissen Sie offensichtlich - absichtlich eine falsche Antwort geben? Ernsthaft?
Glenn Maynard
4
@Glenn: Ich gehe davon aus, dass S.Lott die Frage als "Überprüfen, ob ein String ein Int oder Float ist" verstanden hat (in diesem Fall wäre es tatsächlich eine gute Lösung).
@AA : class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Entschuldigung für die schlechte Syntax, aber ich kann nicht mehr in einer Zeile tun.)
mg.
2
@ AA: Ja. Der Grund ist, dass dies einfacher und zuverlässiger ist. Die Unterscheidung zwischen intund floatmöglicherweise für viele Algorithmen nicht relevant. Das explizite Anfordern des Typs ist normalerweise ein Zeichen für einen schlechten Polymorphismus oder ein noch schwerwiegenderes Entwurfsproblem. Zusamenfassend. Nicht nach Typen suchen. Es ist einfacher, um Vergebung zu bitten, als um Erlaubnis zu bitten.
S.Lott
10

Sie können auch type() Beispiel verwenden:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
user274595
quelle
1
Dies würde in dem [zugegebenermaßen seltenen] Fall fehlschlagen, dass es sich bei der fraglichen Zahl um eine SUBCLASS von int oder float handelt. (Deshalb würde "isinstance" als "besser" angesehen werden, IMO.)
Dan H
7

Hier ist ein Code, der prüft, ob eine Zahl eine Ganzzahl ist oder nicht. Er funktioniert sowohl für Python 2 als auch für 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

Beachten Sie, dass Python 2 beide Typen intund hat long, während Python 3 nur Typ hat int. Quelle .

Wenn Sie überprüfen möchten, ob Ihre Nummer eine ist float, die eine darstellt int, tun Sie dies

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

Wenn Sie nicht zwischen int und float unterscheiden müssen und auch damit einverstanden sind, ist die Antwort von ninjagecko der richtige Weg

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
quelle
6

Wie wäre es mit dieser Lösung?

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

Ich weiß, dass es ein alter Thread ist, aber das ist etwas, das ich benutze, und ich dachte, es könnte helfen.

Es funktioniert in Python 2.7 und 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
quelle
5

Mit modulo können Sie bestimmen, ob x numerisch eine Ganzzahl ist. Die isinstance(x, int)Methode bestimmt nur, ob x eine Ganzzahl nach Typ ist:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
William Gerecke
quelle
3.2 % 2ergibt 1.4. Was redest du, Willi (s | am)? Außerdem erhalten Sie eine, TypeErrorwenn x zunächst keine Zahl ist, sodass Ihr Programm vorzeitig beendet wird, wenn Sie diesen Rat
befolgen
@dylnmc Dann können Sie die isinstance () -Methode verwenden, um festzustellen, ob x eine Zahl ist. Auch 3,2% 1 ergibt 0,2. Wenn eine Zahl gleichmäßig durch 1 teilbar ist, ist sie numerisch eine ganze Zahl. Diese Methode war für mich nützlich, obwohl sie möglicherweise nicht für Sie war.
William Gerecke
Das ist wahr; x%1 == 0sollte nur für Ints gelten (aber auch für Floats mit nur einer Null nach dem Dezimalpunkt). Wenn Sie wissen, dass es sich um ein int handelt (z. B. wenn dies ein Parameter für eine Funktion ist), können Sie dies einfach mit modulo überprüfen. Ich wette, das ist schneller als Math.floor(x) == x. Auf der nicht ganz so hellen Seite ist dies der Fall, Truewenn Sie an einem Schwimmer wie 1.0oder vorbeifahren 5.0, und Sie werden auf dasselbe Problem stoßen , wenn Sie das verwenden, was das Originalplakat in seiner Frage erwähnt hat.
dylnmc
5

Versucht in Python Version 3.6.3 Shell

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

Konnte nichts herausfinden, wofür ich arbeiten könnte.

ella
quelle
4

Bitte überprüfen Sie dies: Importnummern

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

Obwohl X float ist, der Wert jedoch eine Ganzzahl ist, können Sie isinstance nicht verwenden, wenn Sie überprüfen möchten, ob der Wert eine Ganzzahl ist, und Sie müssen Werte und keine Typen vergleichen.

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

Update: Versuchen Sie dies


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
quelle
Ja, ich habe es getan und es hat nicht funktioniert. Und ich bin mir ziemlich sicher, dass Sie es nicht wirklich versucht haben. Weil es nicht funktioniert.
JJJ
Natürlich gibt es eine weniger anstößige Art zu reagieren. Obwohl Sie Recht haben, führe ich einfach mehr Tests durch, es funktioniert nicht in jedem Fall.
Magotte
@JJJ Wie wäre es mit dieser Lösung?
Magotte
0

Sie können dies mit einer einfachen if-Anweisung tun

Auf Schwimmer prüfen

wenn Typ (a) == Typ (1.1)

Um nach einem ganzzahligen Typ zu suchen

wenn Typ (a) == Typ (1)

Alwyn Miranda
quelle
-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
quelle
func prüft auf Ints, gibt aber auch true für Floats zurück, die .0
Gideon Lytes
Bitte erläutern Sie, warum / wie Ihr Beitrag die OP-Frage löst.
Heri
@Heri er versucht zu überprüfen, ob eine Zahl ein int oder ein float ist. Die von mir definierte Funktion kann dies tun. Abs ist eine eingebaute Python-Funktion, die den absoluten Wert der Zahl zurückgibt. Round ist auch eine eingebaute Funktion, die die Zahl abrundet Zahl, wenn ich die gerundete Zahl von der absoluten Eins subtrahiere und eine Null erhalte, dann ist die Zahl ein Int, oder sie hat eine Null wie nach ihren Dezimalstellen
Gideon Lytes
-1

Versuche dies...

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

variable.isnumeric prüft, ob ein Wert eine ganze Zahl ist:

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