Menu

Números y booleanos en Python: int, float, bool y aritmética

Cómo maneja Python los enteros, los números de coma flotante y los booleanos — aritmética, conversión y los casos límite que hacen tropezar a la gente.

Dos tipos de números, un tipo de verdad

Los tipos numéricos que usarás en el día a día son int y float, más bool para valores verdadero/falso. Bastan para casi toda la aritmética y la lógica que un programa Python normal necesita.

main.py
Output
Click Run to see the output here.

Python a veces llama a los booleanos un subtipo de enteros — True es literalmente 1 y False es literalmente 0 — lo que abre unos cuantos trucos útiles más adelante.

Aritmética con enteros

Los enteros en Python nunca se desbordan. Eso suena poco importante hasta que escribes tu primera función factorial y te das cuenta de que la mayoría de otros lenguajes habrían rodado silenciosamente a un número negativo a estas alturas.

main.py
Output
Click Run to see the output here.

Ambas producen respuestas exactas, sin importar lo grandes que sean. La memoria es el único techo.

Los operadores aritméticos son los que esperarías, más un par:

main.py
Output
Click Run to see the output here.

Tres cosas de esa lista que vale la pena memorizar:

  • / siempre devuelve un float en Python 3, incluso cuando ambos lados son enteros. 10 / 2 te da 5.0, no 5. Si quieres un entero, usa //.
  • // redondea hacia menos infinito, así que -7 // 2 es -4, no -3. Inusual, pero consistente.
  • % da el resto, y es útil para "¿este número es par?" (n % 2 == 0) y para envolver dentro de un rango fijo.

Los floats y su trampa famosa

Los floats son imperfectos por diseño. Se almacenan en binario, que no puede representar la mayoría de fracciones decimales exactamente. El ejemplo de libro de texto:

main.py
Output
Click Run to see the output here.

La primera línea imprime 0.30000000000000004. La segunda imprime False. Todo lenguaje que siga el estándar IEEE 754 — Python, JavaScript, Java, C — tiene este comportamiento. No es un bug de Python.

En la práctica, esto significa dos cosas:

  1. No compares floats con ==. Si necesitas "suficientemente cerca", usa math.isclose(a, b) o comprueba si abs(a - b) < alguna_tolerancia.
  2. Para dinero, usa decimal.Decimal. El módulo decimal de la librería estándar te da aritmética decimal exacta — sin sorpresas tipo 0.1 + 0.2. Es más lento que float, razón por la que no es el valor por defecto, pero es la elección correcta para moneda.
main.py
Output
Click Run to see the output here.

Convertir entre tipos numéricos

Python no convertirá silenciosamente un entero a string o un string a número. Lo pides explícitamente:

main.py
Output
Click Run to see the output here.

Las conversiones inválidas lanzan ValueError:

>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'

El mensaje de error es directo y fácil de atender. Limpia la entrada o captura la excepción.

Booleanos, un poco más a fondo

True y False son los dos valores booleanos — escritos exactamente así, mayúscula inicial. La mayoría de comparaciones producen uno de ellos:

main.py
Output
Click Run to see the output here.

Los operadores booleanos son and, or y not, escritos como palabras en inglés en vez de símbolos:

main.py
Output
Click Run to see the output here.

Una sutileza útil: and y or no necesariamente devuelven True o False — devuelven el valor que decidió la expresión. 0 or "fallback" devuelve "fallback"; 5 and 10 devuelve 10. Esto te permite escribir defaults cortos como name = user_input or "anonymous", pero también vale la pena entenderlo si una comprobación booleana te devuelve un tipo inesperado.

Truthy y falsy

Python trata muchos valores como "casi verdadero" o "casi falso" cuando los usas en un contexto booleano como if o while. Los valores falsy son:

  • False
  • 0, 0.0
  • None
  • Contenedores vacíos: "", [], {}, set(), ()

Todo lo demás es truthy. Esto te permite escribir comprobaciones más naturales:

main.py
Output
Click Run to see the output here.

Lee if name: como "si name tiene algo dentro". Mucho más limpio que if name != "":. Solo ten cuidado con los números — if count: tratará 0 como "saltar", que suele pero no siempre es lo que quieres. Si el cero es un valor legítimo, usa if count is not None: en su lugar.

Aritmética con booleanos

Como los booleanos son enteros, puedes hacer aritmética con ellos:

main.py
Output
Click Run to see the output here.

Ese truco aparece lo suficiente como para guardarlo. Si quieres contar cuántos elementos en una lista pasan algún test, suma un generador que devuelve booleanos:

main.py
Output
Click Run to see the output here.

Lo que te llevas en la práctica

  • Los enteros nunca se desbordan. Úsalos libremente.
  • / devuelve un float; usa // cuando quieras división entera.
  • No compares floats con ==; compara con una tolerancia, o usa Decimal para dinero.
  • La truthiness hace que las condiciones se lean mejor — siempre que recuerdes que 0 y los strings vacíos son falsy.

Siguiente: input y print, las dos herramientas que convierten tus scripts de programas silenciosos en conversaciones.

Preguntas frecuentes

¿Cuál es la diferencia entre int y float en Python?

Un int es un número entero sin punto decimal; un float es un número con punto decimal. Los enteros en Python pueden ser de cualquier tamaño — no hay desbordamiento. Los floats siguen las reglas estándar IEEE 754, lo que significa que pueden perder pequeñas cantidades de precisión en aritmética decimal.

¿Por qué 0.1 + 0.2 no es igual a 0.3 en Python?

Porque los números de coma flotante binarios no pueden representar la mayoría de decimales exactamente. 0.1 + 0.2 se evalúa a 0.30000000000000004. No es un bug de Python — cada lenguaje con floats IEEE 754 tiene el mismo comportamiento. Para matemática decimal exacta, usa el módulo decimal.

¿Qué son los valores truthy y falsy en Python?

Python trata muchos valores como verdadero o falso en contextos booleanos, aunque no sean literalmente True o False. El cero, los strings vacíos, las listas vacías, los dicts vacíos y None son falsy; la mayoría de otros valores son truthy. if my_list: se lee como "si la lista tiene algo dentro".

Aprende a programar con Coddy

COMENZAR