Periksa apakah nomor int atau float

200

Begini cara saya melakukannya:

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

Sesuatu seperti itu.
Apakah ada cara lain yang lebih baik untuk melakukan ini?

Steinthor.palsson
sumber
4
Kuncinya adalah mencari di SO untuk semua waktu pertanyaan ini ditanyakan. Masing-masing akan memberikan pengulangan dari jawaban standar yang sama.
S.Lott
1
... Dan mengapa kamu perlu tahu?
Karl Knechtel
@ Wooble: gagal untuk angka yang lebih besar .
jfs
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)adalah apa yang saya cari ketika saya menemukan pertanyaan ini dengan Google.
Martin Thoma

Jawaban:

285

Gunakan isinstance .

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

Begitu:

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

x is a int!

_EDIT: _

Seperti yang ditunjukkan, dalam kasus bilangan bulat panjang, hal di atas tidak akan berfungsi. Jadi yang perlu Anda lakukan:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
pengguna225312
sumber
tidak issubclassakan lebih generik?
David Heffernan
3
@ David: issubclassakan menjadi kesalahan, karena bekerja di kelas. isinstancememeriksa apakah objek yang diberikan adalah turunan dari kelas atau salah satu dari subclass kelas itu , jadi itu generik. Pemikiran yang isinstance(obj, cls)setara denganissubclass(obj.__class__, cls)
7
Ini tidak berfungsi untuk tipe integer lainnya, misalnya jika x = 12L. Saya tahu hanya intdiminta, tetapi senang memperbaiki masalah lain sebelum terjadi. Mungkin yang paling umum isinstance(x, numbers.Integral).
Scott Griffiths
9
Untuk Python 2, ada juga periksa langsung: isinstance(x, (int, long)).
Eric O Lebigot
1
PERINGATAN: bools juga merupakan contoh bilangan bulat. Lihatisinstance(True, int)
jtschoonhoven
95

Saya paling suka @ ninjagecko menjawab.

Ini juga akan berfungsi:

untuk Python 2.x

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

Python 3.x tidak panjang

isinstance(n, (int, float))

ada juga tipe complex untuk bilangan kompleks

Dan H
sumber
Sebuah catatan pinggir, karena boolean akan memutuskan untuk Benar (misalnya isinstance(False, (int, float)) = True), saya butuhkan not isinstance(n, bool) and isinstance(n, (int, float))bukan
YTZ
54

Satu-liner:

isinstance(yourNumber, numbers.Real)

Ini menghindari beberapa masalah:

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

Lebih mudah untuk meminta maaf daripada meminta izin. Cukup lakukan operasi. Jika berhasil, objek itu dari jenis yang dapat diterima, cocok, tepat. Jika operasi tidak berhasil, objek itu bukan tipe yang cocok. Mengetahui tipenya jarang membantu.

Cukup coba operasi dan lihat apakah itu berfungsi.

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
sumber
5
Apakah ada alasan untuk melakukan ini kapan typedan isinstancedapat melakukan pekerjaan itu?
user225312
9
int (1.5) tidak meningkatkan ValueError, dan Anda jelas tahu itu - sengaja memberikan jawaban yang salah? Serius?
Glenn Maynard
4
@ Glenn: Saya berasumsi S.Lott memahami pertanyaan sebagai "periksa apakah sebuah string adalah int atau float" (dalam hal ini sebenarnya akan menjadi solusi yang baik).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Maaf untuk sintaks yang buruk tetapi saya tidak dapat melakukan lebih dari satu baris.)
mg.
2
@ AA: Ya. Alasannya adalah ini lebih sederhana dan lebih dapat diandalkan. Perbedaan antara intdan floatbahkan mungkin tidak relevan untuk banyak algoritma. Meminta jenis secara eksplisit biasanya merupakan tanda polimorfisme buruk atau masalah desain yang lebih serius. Pendeknya. Jangan Periksa Jenis. Lebih Mudah Meminta Pengampunan daripada Meminta Izin.
S.Lott
10

Yang dapat Anda lakukan juga adalah menggunakan type() Contoh:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
pengguna274595
sumber
1
Ini akan gagal dalam kasus [yang diakui jarang] bahwa angka yang dimaksud adalah SUBCLASS dari int atau float. (Oleh karena itu mengapa "isinstance" akan dianggap "lebih baik", IMO.)
Dan H
7

Berikut adalah sepotong kode yang memeriksa apakah angka bilangan bulat atau tidak, ia berfungsi untuk Python 2 dan 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

Perhatikan bahwa Python 2 memiliki kedua tipe intdan long, sedangkan Python 3 hanya memiliki tipe int. Sumber .

Jika Anda ingin memeriksa apakah nomor Anda adalah floatyang mewakili int, lakukan ini

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

Jika Anda tidak perlu membedakan antara int dan float, dan tidak apa-apa dengan baik, maka jawaban ninjagecko adalah cara untuk pergi

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
sumber
6

bagaimana dengan solusi ini?

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

Saya tahu ini adalah utas lama tetapi ini adalah sesuatu yang saya gunakan dan saya pikir itu mungkin membantu.

Ia bekerja di python 2.7 dan 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
sumber
5

Anda dapat menggunakan modulo untuk menentukan apakah x adalah bilangan bulat. The isinstance(x, int)Metode hanya menentukan jika x adalah bilangan bulat dengan jenis:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
William Gerecke
sumber
3.2 % 2hasil panen 1.4. Apa yang kau bicarakan, Willi? Selain itu, Anda akan mendapatkan TypeErrorjika x bukan angka untuk memulai, sehingga program Anda akan keluar sebelum waktunya jika Anda mengikuti saran ini ...
dylnmc
@dnmnmc Kemudian Anda dapat menggunakan metode isinstance () untuk menentukan apakah x adalah angka. Juga, hasil 3,2% 1 0,2. Jika angka dibagi habis 1, itu adalah bilangan bulat. Metode ini bermanfaat bagi saya meskipun mungkin bukan untuk Anda.
William Gerecke
ini benar; x%1 == 0harus benar hanya untuk int (tetapi juga berlaku untuk float dengan titik desimal nol berikut). Jika Anda tahu itu akan menjadi int (misalnya, jika ini adalah param untuk suatu fungsi), maka Anda bisa memeriksa dengan modulo. Saya yakin itu lebih cepat dari Math.floor(x) == x. Pada sisi yang tidak terlalu cerah, ini akan terjadi Truejika Anda melewati float like 1.0atau 5.0, dan Anda akan menghadapi masalah yang sama dengan menggunakan apa yang disebutkan oleh poster asli dalam pertanyaannya.
dylnmc
5

Mencoba dalam Python versi 3.6.3 Shell

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

Tidak dapat menemukan sesuatu untuk bekerja.

ella
sumber
4

tolong periksa ini: nomor impor

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

Meskipun X adalah float tetapi nilainya integer, jadi jika Anda ingin memeriksa nilainya integer Anda tidak dapat menggunakan isinstance dan Anda perlu membandingkan nilai bukan tipe.

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

Perbarui: Coba ini


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
sumber
Ya saya lakukan dan itu tidak berhasil. Dan saya cukup yakin Anda tidak benar-benar mencobanya. Karena itu tidak berhasil.
JJJ
Tentu saja, ada cara yang kurang ofensif untuk merespons. Meskipun Anda benar, saya hanya menjalankan lebih banyak tes, itu tidak berhasil dalam setiap kasus.
Magotte
@ JJJ Bagaimana dengan solusi ini?
Magotte
0

Anda dapat melakukannya dengan pernyataan if if sederhana

Untuk memeriksa float

if type (a) == type (1.1)

Untuk memeriksa tipe integer

if type (a) == type (1)

Alwyn Miranda
sumber
-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
sumber
func memeriksa ints tetapi juga mengembalikan true untuk float yang .0
Gideon Lytes
Tolong jelaskan mengapa / bagaimana kontribusi Anda memecahkan pertanyaan OP.
Heri
@Heri dia mencari untuk memeriksa apakah angka adalah int atau float, fungsi yang saya definisikan dapat melakukan itu, abs adalah fungsi python inbuilt yang mengembalikan nilai absolut nomor, putaran juga merupakan fungsi inbuilt yang membulatkan angka, jika saya mengurangi angka bulat dari angka absolut, dan saya mendapatkan nol, maka angka itu adalah int, atau memiliki nol seperti setelah tempat desimalnya
Gideon Lytes
-1

Coba ini...

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

variable.isnumeric memeriksa apakah suatu nilai adalah bilangan bulat:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
orang
sumber