Kiểm tra xem một số là int hay float


200

Đây là cách tôi đã làm:

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

Một cái gì đó như thế.
Có cách nào đẹp hơn để làm điều này?


4
Bí quyết là tìm kiếm trên SO cho tất cả các lần khác câu hỏi này được hỏi. Mỗi câu hỏi sẽ cung cấp một câu trả lời giống nhau, tiêu chuẩn.
S.Lott

1
... Và tại sao bạn cần biết?
Karl Knechtel


@Wooble: thất bại cho số lượng lớn hơn .
jfs

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)là những gì tôi đang tìm kiếm khi tôi tìm thấy câu hỏi này với Google.
Martin Thoma

Câu trả lời:


285

Sử dụng isinstance .

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

Vì thế:

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

x is a int!

_BIÊN TẬP:_

Như đã chỉ ra, trong trường hợp số nguyên dài, phần trên sẽ không hoạt động. Vì vậy, bạn cần phải làm:

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

sẽ không issubclasschung chung hơn?
David Heffernan

3
@David: issubclasssẽ là một lỗi, vì nó hoạt động trên các lớp. isinstancekiểm tra xem một đối tượng đã cho là một thể hiện của một lớp hay một trong các lớp con của lớp đó , vì vậy nó hoàn toàn chung chung. Methinks isinstance(obj, cls)tương đương vớiissubclass(obj.__class__, cls)

7
Điều này không làm việc cho các loại số nguyên khác, ví dụ nếu x = 12L. Tôi biết chỉ intđược yêu cầu, nhưng thật tốt để khắc phục các vấn đề khác trước khi chúng xảy ra. Nói chung nhất có lẽ là isinstance(x, numbers.Integral).
Scott Griffiths

9
Đối với Python 2, cũng có kiểm tra kép trực tiếp : isinstance(x, (int, long)).
Eric O Lebigot

1
CẢNH BÁO: bools cũng là trường hợp của số nguyên. Xemisinstance(True, int)
jtschoonhoven 16/07/18

94

Tôi thích câu trả lời của @ ninjagecko nhất.

Điều này cũng sẽ làm việc:

cho Python 2.x

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

Python 3.x không có lâu

isinstance(n, (int, float))

cũng có loại phức cho số phức


Một sidenote, bởi vì booleans sẽ giải quyết thành True (ví dụ isinstance(False, (int, float)) = True), not isinstance(n, bool) and isinstance(n, (int, float))thay vào đó tôi cần
YTZ

54

Lót:

isinstance(yourNumber, numbers.Real)

Điều này tránh một số vấn đề:

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

Bản giới thiệu:

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

12

Yêu cầu sự tha thứ dễ dàng hơn xin phép. Đơn giản chỉ cần thực hiện các hoạt động. Nếu nó hoạt động, đối tượng là một loại thích hợp, phù hợp, chấp nhận được. Nếu hoạt động không hoạt động, đối tượng không phải là loại phù hợp. Biết các loại hiếm khi giúp đỡ.

Đơn giản chỉ cần thử các hoạt động và xem nếu nó hoạt động.

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ó bất kỳ lý do để làm điều này khi typeisinstancecó thể thực hiện công việc?
user225312

9
int (1.5) không tăng ValueError và bạn rõ ràng biết điều đó - đưa ra một câu trả lời sai về mục đích? Nghiêm túc?
Glenn Maynard

4
@Glenn: Tôi giả sử S.Lott hiểu câu hỏi là "kiểm tra xem một chuỗi là int hay float" (trong trường hợp đó nó thực sự sẽ là một giải pháp tốt).

@AA : class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Xin lỗi vì cú pháp xấu nhưng tôi không thể làm nhiều hơn trên một dòng.)
mg.

2
@AA: Vâng. Lý do là điều này đơn giản và đáng tin cậy hơn. Sự khác biệt giữa intfloatthậm chí có thể không liên quan đến nhiều thuật toán. Yêu cầu loại rõ ràng thường là một dấu hiệu của đa hình xấu hoặc một vấn đề thiết kế thậm chí nghiêm trọng hơn. Nói ngắn gọn. Đừng kiểm tra các loại. Yêu cầu tha thứ dễ dàng hơn xin phép.
S.Lott

10

Những gì bạn có thể làm là sử dụng type() Ví dụ:

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

1
Điều này sẽ thất bại trong trường hợp [hiếm khi thừa nhận] rằng số trong câu hỏi là một SUBCLASS của int hoặc float. (Do đó, tại sao "isinstance" sẽ được coi là "tốt hơn", IMO.)
Dan H

7

Đây là một đoạn mã kiểm tra xem một số có phải là số nguyên hay không, nó hoạt động cho cả Python 2 và 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

Lưu ý rằng Python 2 có cả hai loại intlongtrong khi Python 3 chỉ có loại int. Nguồn .

Nếu bạn muốn kiểm tra xem số của bạn có phải là số floatđại diện cho một hay không int, hãy làm điều này

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

Nếu bạn không cần phân biệt int và float, và cũng ổn với một trong hai, thì câu trả lời của ninjagecko là cách để đi

import numbers

isinstance(yourNumber, numbers.Real)

6

Làm thế nào về giải pháp này?

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

6

Tôi biết đó là một chủ đề cũ nhưng đây là thứ tôi đang sử dụng và tôi nghĩ nó có thể giúp ích.

Nó hoạt động trong python 2.7 và 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

Bạn có thể sử dụng modulo để xác định xem x có phải là số nguyên không. Các isinstance(x, int)phương pháp xác định chỉ nếu x là một số nguyên theo loại:

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

3.2 % 2sản lượng 1.4. Cơn sốt của ai đó, Willi (s | am)? Ngoài ra, bạn sẽ nhận được TypeErrornếu x không phải là số bắt đầu, vì vậy chương trình của bạn sẽ thoát sớm nếu bạn làm theo lời khuyên này ...
dylnmc

@dylnmc Sau đó, bạn có thể sử dụng phương thức isinstance () để xác định xem x có phải là số không. Ngoài ra, 3,2% 1 mang lại 0,2. Nếu một số chia hết cho 1, thì đó là một số nguyên. Phương pháp này hữu ích với tôi mặc dù nó có thể không dành cho bạn.
William Gerecke

điều này đúng x%1 == 0chỉ đúng với số nguyên (nhưng nó cũng đúng với số float chỉ có số thập phân sau 0). Nếu bạn biết nó sẽ là một int (ví dụ: nếu đây là một tham số cho hàm), thì bạn có thể kiểm tra bằng modulo. Tôi cá rằng đó là nhanh hơn Math.floor(x) == x. Về mặt không sáng sủa, điều này sẽ xảy ra Truenếu bạn vượt qua một float như 1.0hoặc 5.0, và bạn sẽ gặp phải vấn đề tương tự bằng cách sử dụng những gì áp phích ban đầu được đề cập trong câu hỏi của anh ấy / cô ấy.
dylnmc

5

Đã thử trong phiên bản Python 3.6.3 Shell

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

Không thể tìm ra bất cứ điều gì để làm việc.


4

vui lòng kiểm tra cái này: số nhập

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

Mặc dù X là float nhưng giá trị là số nguyên, vì vậy nếu bạn muốn kiểm tra giá trị là số nguyên, bạn không thể sử dụng isinstance và bạn cần so sánh các giá trị không phải là loại.


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

0

Cập nhật: Hãy thử điều này


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)

Có tôi đã làm và nó đã không làm việc. Và tôi khá chắc chắn rằng bạn đã không thực sự thử nó. Bởi vì nó không hoạt động.
JJJ

Chắc chắn, có một cách ít phản ứng hơn. Mặc dù bạn đúng nhưng tôi chỉ chạy thử nghiệm nhiều hơn nhưng nó không hoạt động trong mọi trường hợp.
Magotte

@JJJ Làm thế nào về giải pháp này?
Magotte

0

Bạn có thể làm điều đó với câu lệnh if đơn giản

Để kiểm tra phao

nếu loại (a) == loại (1.1)

Để kiểm tra loại số nguyên

nếu loại (a) == loại (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 kiểm tra ints nhưng cũng trả về true cho số float là .0
Gideon Lytes

Vui lòng giải thích lý do / cách đóng góp của bạn giải quyết câu hỏi OP.
Heri

@Heri anh ấy đang tìm kiếm để kiểm tra xem một số là số nguyên hay số float, hàm tôi xác định có thể làm điều đó không, abs là một hàm python sẵn có trả về giá trị tuyệt đối của số đó, vòng cũng là một hàm funcilt làm tròn số số, nếu tôi trừ số làm tròn từ số tuyệt đối và tôi nhận được số 0, thì số đó là số nguyên hoặc nó có số 0 như sau số thập phân của nó
Gideon Lytes

-1

Thử cái này...

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

-5

variable.isnumeric kiểm tra nếu một giá trị là một số nguyên:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.