2011-06-04 48 views
12

Me gustaría determinar si un valor numérico en Python es un número entero. Por ejemplo, dada:Determinar si un valor es un número entero en Python

y = x/3 

Quiero distinguir entre valores de x que son uniformemente divisible por 3 los que no lo son.

+5

¿Qué quiere decir con decimales en este caso? Un entero es un número entero. Siempre es un número entero. De alguna manera, parece que quieres verificar un número entero de enfermedades: * Este número entero tiene decimales, ¡tenemos que llevarlo al hospital! *;) –

+2

¿A qué te refieres con "decimales" en este contexto? ¿Punto decimal? Los enteros nunca los tienen (un número con un punto decimal se analiza como un número de coma flotante). –

+1

Un entero por definición no tiene decimales. Tada! ¡Estás listo! –

Respuesta

23
if x % 3 == 0: 
    print 'x is divisible by 3' 
+1

@lev Parte de la respuesta a las preguntas aquí es entender lo que el OP realmente quería hacer. Lea más que solo el título de la pregunta. Aquí está claro que el OP quería saber cómo saber si un número es divisible por otro. Hacer eso comprobando si el resultado de la división es un número entero es antiponético y propenso a errores. – interjay

+1

Importante: esto no comprueba si un número es decimal, como sugeriría el título y parte de la pregunta. Por ejemplo, si tiene x == 0.3, el código anterior imprimirá 'x es divisible por 3', pero x no es un número entero. Vea la respuesta de Artur Gaspar para verificar si un número es un decimal. @interjay esto debería hacer. – lev

1

suponiendo que decir que si una cadena que contiene los dedos también tiene un punto decimal:

Python 2.6.6 (r266:84292, Apr 20 2011, 11:58:30) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> number='123.4' 
>>> '.' in number 
True 
>>> number='123' 
>>> '.' in number 
False 
>>> 

Para probar si es integral que podría Mod 1:

>>> 1.0/3 % 1 
0.33333333333333331 
>>> 1/3 % 1 
0 
3

x % 3 == 0 habrá True si x/3 es un número entero.

49

Los enteros no tienen decimales. Si nos referimos "comprobar si un número consiguió decimales en Python", que puede hacer:

not float(your_number).is_integer() 
+1

Documentación relacionada: http://docs.python.org/library/stdtypes.html#float.is_integer – Olli

+2

'is_integer()' es la respuesta –

1

En Python 2, dividir un entero por un int devuelve un int (a menos pitón se invocó con la opción -Qnew, o from __future__ import division está al principio de la fuente; en ese caso / devuelve un flotador); a // especifica la división de enteros.

En Python 3, dividir un int por un int devuelve un float si usa "/", o un int si usa "//".

Si desea saber si una int se dividirá en otra int exactamente, use "%" para buscar un resto.

-1

Lo mejor es hacer su determinación antes de hacer la división, suponiendo que su variable x es un número entero.

Tratar de hacer tests de igualdad o comparaciones de números de punto flotante es peligroso: http://www.lahey.com/float.htm

La respuesta ya proporciona el uso de un módulo antes de hacer la división para ver si un entero es divsible por el otro entero es seguro. Después de hacer una división y tratar con posibles valores de coma flotante, los números ya no son enteros o no exactamente.

4

Editar: Como Ollie señaló en el comentario debajo de esta publicación, is_integer es parte de la biblioteca estándar y por lo tanto no se debe volver a implementar como lo hice a continuación.

Esta función utiliza el hecho de que cada otro número entero tendrá al menos un número divisible por dos sin resto. Cualquier representación fraccional distinta de cero en n o n+1 hará que n%2 y (n+1)%2 tengan un resto. Esto tiene la ventaja de que los números enteros representados como valores flotantes devolverán True. La función funciona correctamente para positivo y números negativos y cero, hasta donde puedo determinar. Como se menciona en la función, falla para valores muy cercanos a un entero.

def isInteger(n): 
    """Return True if argument is a whole number, False if argument has a fractional part. 

    Note that for values very close to an integer, this test breaks. During 
    superficial testing the closest value to zero that evaluated correctly 
    was 9.88131291682e-324. When dividing this number by 10, Python 2.7.1 evaluated 
    the result to zero""" 

    if n%2 == 0 or (n+1)%2 == 0: 
     return True 
    return False 
+1

Como se contestó anteriormente (http://stackoverflow.com/a/6239987/592174), is_integer es parte de la biblioteca estándar de Python. http://docs.python.org/library/stdtypes.html#float.is_integer No debes volver a implementarlo. – Olli

1

Aquí hay otro método:

x = 1/3 # insert your number here 
print(x - int(x) == 0) # True if x is a whole number, False if it has decimals. 

Esto funciona porque int (x) realiza esencialmente el límite inferior del número (por ejemplo 3,6453 -> 3.). Si hay algo sobrante una vez que restas el piso, no puede haber sido un número entero.

Cuestiones relacionadas