Проверьте, является ли число int или float

200

Вот как я это сделал:

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

Что-то такое.
Есть ли более приятные способы сделать это?

Steinthor.palsson
источник
4
Хитрость заключается в том, чтобы искать в SO все остальные моменты, когда задавался этот вопрос. Каждый из них даст повторение того же стандартного ответа.
С.Лотт
1
... а зачем тебе это знать?
Карл Кнехтель
@Wooble: это не удается для больших чисел .
JFS
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)было то, что я искал, когда я нашел этот вопрос с Google.
Мартин Тома

Ответы:

285

Используйте isinstance .

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

Так:

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

x is a int!

_РЕДАКТИРОВАТЬ:_

Как указано, в случае длинных целых чисел вышеприведенное не сработает. Так что вам нужно сделать:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
user225312
источник
не issubclassбудет более общим?
Дэвид Хеффернан
3
@ Дэвид: issubclassбыло бы ошибкой, так как он работает на классах. isinstanceпроверяет, является ли данный объект экземпляром класса или одного из подклассов этого класса , поэтому он совершенно универсален. Метинкс, что isinstance(obj, cls)эквивалентноissubclass(obj.__class__, cls)
7
Это не работает для других целочисленных типов, например, если x = 12L. Я знаю, что только intпросили, но хорошо, чтобы исправить другие проблемы, прежде чем они случаются. Вероятно, самый общий isinstance(x, numbers.Integral).
Скотт Гриффитс
9
Для Python 2, есть также прямая двойная проверка: isinstance(x, (int, long)).
Эрик О Лебиго
1
ВНИМАНИЕ: bools также являются экземплярами целых чисел. Смотритеisinstance(True, int)
jtschoonhoven
95

Мне больше всего нравится ответ @ ninjagecko.

Это также будет работать:

для Python 2.x

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

Python 3.x не долго

isinstance(n, (int, float))

есть также комплекс типа для комплексных чисел

Дэн Х
источник
Замечание, потому что булевы будет решать True (например isinstance(False, (int, float)) = True), мне нужно not isinstance(n, bool) and isinstance(n, (int, float))вместо
YTZ
54

Один лайнер:

isinstance(yourNumber, numbers.Real)

Это позволяет избежать некоторых проблем:

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

Демо-версия:

>>> 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
источник
6
В Python 3 isinstance(99**10,int)есть True.
Карлос А. Гомес
12

Проще просить прощения, чем просить разрешения. Просто выполните операцию. Если это работает, объект имел приемлемый, подходящий, правильный тип. Если операция не работает, объект не подходящего типа. Знание типа редко помогает.

Просто попробуйте выполнить операцию и посмотрите, работает ли она.

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
Есть ли причина делать это, когда typeи isinstanceможете сделать работу?
user225312
9
int (1.5) не вызывает ValueError, и вы, очевидно, знаете это - нарочно дают неправильный ответ? Шутки в сторону?
Гленн Мейнард
4
@Glenn: я предполагаю, что С.Лотт понимал вопрос как «проверил, является ли строка целым числом или числом с плавающей точкой» (в этом случае это было бы действительно хорошим решением).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Извините за плохой синтаксис, но я не могу сделать больше в одной строке.)
мг.
2
@АА: да. Причина в том, что это проще и надежнее. Различие между intи floatможет даже не иметь отношения ко многим алгоритмам. Запрос типа явно является признаком плохого полиморфизма или еще более серьезной проблемы проектирования. Коротко. Не проверяйте типы. Прощать проще, чем спрашивать разрешения.
С.Лотт
10

То, что вы тоже можете сделать, это использовать type() Пример:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
user274595
источник
1
Это потерпит неудачу в [по общему признанию редком] случае, когда рассматриваемое число является ПОДКЛАССОМ int или float. (Отсюда, почему «isinstance» будет считаться «лучше», ИМО.)
Дэн Х
7

Вот фрагмент кода, который проверяет, является ли число целым числом или нет, он работает как для Python 2, так и для 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

Обратите внимание, что Python 2 имеет оба типа intи long, в то время как Python 3 имеет только тип int. Источник .

Если вы хотите проверить, является ли ваш номер floatзнаком int, сделайте это

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

Если вам не нужно различать int и float, и вы согласны с любым из них, то ответ ninjagecko - это путь

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
источник
6

как насчет этого решения?

if type(x) in (float, int):
    # do whatever
else:
    # do whatever
krakowi
источник
6

Я знаю, что это старая тема, но это то, что я использую, и я подумал, что это может помочь.

Он работает в Python 2.7 и 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

Вы можете использовать модуль по модулю, чтобы определить, является ли х целым числом численно. isinstance(x, int)Метод определяет только тогда , когда х обозначает целое число от типа:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
Уильям Гереке
источник
3.2 % 2доходность 1.4. Что ты говоришь, Вилли? Кроме того, вы получите a, TypeErrorесли x не является числом для начала, поэтому ваша программа преждевременно завершит работу, если вы последуете этому совету ...
dylnmc
@dylnmc Затем вы можете использовать метод isinstance (), чтобы определить, является ли x числом. Также 3,2% 1 дает 0,2. Если число делится на 1 равномерно, оно является целым числом. Этот метод был полезен для меня, даже если он не был для вас.
Уильям Гереке
это верно; x%1 == 0должно быть истинным только для целых чисел (но это также будет верно для чисел с плавающей запятой только с нулем после десятичной точки). Если вы знаете, что это будет int (например, если это параметр функции), то вы можете просто проверить по модулю. Могу поспорить, что это быстрее, чем Math.floor(x) == x. С не очень яркой стороны, это будет, Trueесли вы передадите поплавок, похожий на 1.0или 5.0, и вы столкнетесь с той же проблемой, используя то, что оригинальный постер упомянул в своем вопросе.
17
5

Пробовал в Python версии 3.6.3 Shell

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

Не могу понять, на что работать.

Элла
источник
4

пожалуйста, проверьте это: импорт номеров

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

Хотя X - это число с плавающей точкой, но значение является целым числом, поэтому, если вы хотите проверить, что значение является целым числом, вы не можете использовать isinstance, и вам нужно сравнивать значения, а не типы.

M.Hefny
источник
1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'
Аджай Праджапати
источник
0

Обновление: попробуйте это


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
источник
Да, я сделал, и это не сработало. И я уверен, что ты на самом деле не пробовал. Потому что это не работает.
JJJ
Конечно, есть менее оскорбительный способ ответить. Хотя вы правы, я просто провожу больше тестов, но это работает не во всех случаях.
Magotte
@JJJ Как насчет этого решения?
Magotte
0

Вы можете сделать это с помощью простого оператора if

Для проверки поплавка

если тип (а) == тип (1.1)

Для проверки целочисленного типа

если тип (а) == тип (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 проверяет целочисленные значения, но также возвращает true для чисел с плавающей точкой .0
Gideon Lytes
Пожалуйста, объясните, почему / как ваш вклад решает вопрос ОП.
Хери
@ Привет, он хочет проверить, является ли число целым или плавающим, определенная мной функция может это сделать, abs - это встроенный python-функция, которая возвращает абсолютное значение числа, round - также встроенный, который округляет число, если я вычтю округленное число из абсолютного и получу ноль, то число будет целым, или у него будет ноль, как после десятичных разрядов
Гидеон Литес
-1

Попробуй это...

def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  return absolute - rounded == 0
Рамкумар Г
источник
-5

variable.isnumeric проверяет, является ли значение целым числом:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
человек
источник