Vérifiez si un nombre est entier ou flottant

200

Voici comment je l'ai fait:

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

Quelque chose comme ca.
Existe-t-il des moyens plus agréables de procéder?

Steinthor.palsson
la source
4
L'astuce consiste à rechercher sur SO toutes les autres fois où cette question a été posée. Chacun d'eux fournira une répétition de la même réponse standard.
S.Lott
1
... Et pourquoi avez-vous besoin de savoir?
Karl Knechtel
@Wooble: il échoue pour les plus grands nombres .
jfs
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)était ce que je cherchais lorsque j'ai trouvé cette question avec Google.
Martin Thoma

Réponses:

285

Utilisez l' instance .

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

Alors:

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

x is a int!

_ÉDITER:_

Comme indiqué, en cas de longs entiers, ce qui précède ne fonctionnera pas. Vous devez donc faire:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
user225312
la source
ne serait pas issubclassplus générique?
David Heffernan
3
@David: issubclassserait une erreur, car cela fonctionne sur les classes. isinstancevérifie si un objet donné est une instance d'une classe ou de l'une des sous-classes de cette classe , il est donc parfaitement générique. Methinks qui isinstance(obj, cls)équivaut àissubclass(obj.__class__, cls)
7
Cela ne fonctionne pas pour les autres types d'entiers, par exemple si x = 12L. Je sais que seule la intdemande a été faite, mais il est agréable de résoudre d'autres problèmes avant qu'ils ne surviennent. Le plus générique est probablement isinstance(x, numbers.Integral).
Scott Griffiths
9
Pour Python 2, il y a aussi le chèque à double directe: isinstance(x, (int, long)).
Eric O Lebigot
1
AVERTISSEMENT: les bools sont également des instances d'entiers. Voirisinstance(True, int)
jtschoonhoven
95

J'aime le plus la réponse de @ ninjagecko.

Cela fonctionnerait également:

pour Python 2.x

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

Python 3.x n'a pas longtemps

isinstance(n, (int, float))

il existe également des types complexes pour les nombres complexes

Dan H
la source
Un sidenote, parce que les booléens se résoudront en True (par exemple isinstance(False, (int, float)) = True), j'avais besoin à la not isinstance(n, bool) and isinstance(n, (int, float))place
YTZ
54

Bon mot:

isinstance(yourNumber, numbers.Real)

Cela évite certains problèmes:

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

Démo:

>>> 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
la source
6
En Python 3 isinstance(99**10,int)est True.
Carlos A. Gómez
12

Il est plus facile de demander pardon que de demander la permission. Effectuez simplement l'opération. Si cela fonctionne, l'objet était d'un type acceptable, approprié et approprié. Si l'opération ne fonctionne pas, l'objet n'était pas d'un type approprié. Connaître le type aide rarement.

Essayez simplement l'opération et voyez si cela fonctionne.

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
la source
5
Y a-t-il une raison de le faire quand typeet isinstancepeut faire le travail?
user225312
9
int (1.5) ne déclenche pas ValueError, et vous le savez évidemment - donner une mauvaise réponse exprès? Sérieusement?
Glenn Maynard
4
@Glenn: Je suppose que S.Lott a compris la question comme "vérifier si une chaîne est un entier ou un flottant" (auquel cas ce serait en fait une bonne solution).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Désolé pour la mauvaise syntaxe mais je ne peux pas faire plus sur une seule ligne.)
mg.
2
@AA: Oui. La raison en est que c'est plus simple et plus fiable. La distinction entre intet floatpeut même ne pas être pertinente pour de nombreux algorithmes. La demande explicite du type est généralement un signe de mauvais polymorphisme ou un problème de conception encore plus grave. En bref. Ne vérifiez pas les types. Il est plus facile de demander pardon que de demander la permission.
S.Lott
10

Ce que vous pouvez aussi faire, c'est utiliser type() Exemple:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
user274595
la source
1
Cela échouerait dans le cas [certes rare] où le nombre en question est une sous-classe d'int ou float. (D'où la raison pour laquelle "isinstance" serait considéré comme "meilleur", OMI.)
Dan H
7

Voici un morceau de code qui vérifie si un nombre est un entier ou non, il fonctionne à la fois pour Python 2 et 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

Notez que Python 2 a les deux types intet long, tandis que Python 3 n'a que le type int. Source .

Si vous souhaitez vérifier si votre numéro est un floatqui représente un int, procédez comme suit

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

Si vous n'avez pas besoin de faire la distinction entre int et float, et que vous êtes d'accord non plus, alors la réponse de ninjagecko est la voie à suivre

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
la source
6

que diriez-vous de cette solution?

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

Je sais que c'est un vieux fil mais c'est quelque chose que j'utilise et j'ai pensé que ça pourrait aider.

Il fonctionne en python 2.7 et 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
la source
5

Vous pouvez utiliser modulo pour déterminer si x est un entier numériquement. La isinstance(x, int)méthode détermine uniquement si x est un entier par type:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
William Gerecke
la source
3.2 % 2rendements 1.4. Whatchu talkin 'bout bout, Willi (s | am)? De plus, vous obtiendrez un TypeErrorsi x n'est pas un nombre pour commencer, donc votre programme se
fermera
@dylnmc Vous pouvez ensuite utiliser la méthode isinstance () pour déterminer si x est un nombre. De plus, 3,2% 1 donne 0,2. Si un nombre est divisible par 1, il s'agit d'un entier numériquement. Cette méthode m'a été utile même si elle n'était peut-être pas pour vous.
William Gerecke
c'est vrai; x%1 == 0devrait être vrai uniquement pour les entiers (mais ce sera également vrai pour les flottants avec seulement un zéro après le point décimal). Si vous savez que ce sera un int (par exemple, s'il s'agit d'un paramètre d'une fonction), vous pouvez simplement vérifier avec modulo. Je parie que c'est plus rapide que Math.floor(x) == x. Du côté moins brillant, ce sera Truesi vous passez un flotteur comme 1.0ou 5.0, et vous rencontrerez le même problème en utilisant ce que l'affiche originale mentionnée dans sa question.
dylnmc
5

Testé dans Python version 3.6.3 Shell

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

Impossible de trouver quoi que ce soit pour travailler.

ella
la source
4

veuillez vérifier ceci: importer des numéros

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

Bien que X soit flottant mais que la valeur soit un entier, donc si vous voulez vérifier que la valeur est un entier, vous ne pouvez pas utiliser isinstance et vous devez comparer les valeurs et non les types.

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

Mise à jour: essayez ceci


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
la source
Oui, je l'ai fait et cela n'a pas fonctionné. Et je suis presque sûr que vous ne l'avez pas vraiment essayé. Parce que ça ne marche pas.
JJJ
Certes, il existe une façon moins offensive de répondre. Bien que vous ayez raison, je lance plus de tests, cela ne fonctionne pas dans tous les cas.
Magotte
@JJJ Et cette solution?
Magotte
0

Vous pouvez le faire avec une simple instruction if

Pour vérifier le flotteur

si type (a) == type (1.1)

Pour vérifier le type entier

si type (a) == type (1)

Alwyn Miranda
la source
-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
la source
func vérifie les ints mais renvoie également true pour les flottants qui sont .0
Gideon Lytes
Veuillez expliquer pourquoi / comment votre contribution résout la question des PO.
Heri
@Heri, il cherche à vérifier si un nombre est un entier ou un flottant, la fonction que j'ai définie peut le faire, abs est un func python intégré qui renvoie la valeur absolue du nombre, round est également un func intégré qui arrondit le nombre, si je soustrais le nombre arrondi de l'absolu, et j'obtiens un zéro, alors le nombre est un entier, ou il a un zéro comme après ses décimales
Gideon Lytes
-1

Essaye ça...

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

variable.isnumeric vérifie si une valeur est un entier:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
la personne
la source