Números, Booleanos y Aritmética
Python proporciona enteros de tamaño ilimitado, flotantes binarios y tipos numéricos exactos para dominios que no pueden tolerar errores de redondeo. Los booleanos participan en la aritmética porque heredan de int.
Receta
from decimal import Decimal
price = Decimal("19.99")
tax = Decimal("0.0825")
total = price * (1 + tax)
a, b = 7, 3
print(a / b, a // b, a % b, divmod(a, b))Cuándo recurrir a esto:
- Cálculos financieros que requieren semántica decimal exacta
- Computación científica con flotantes y tolerancias
- Indicadores bit a bit y protocolos de enteros
- Pruebas de verdad en condiciones
ifywhile
Ejemplo de Trabajo
from decimal import Decimal, ROUND_HALF_UP
from fractions import Fraction
def invoice_line(unit_price: str, qty: int, tax_rate: str) -> Decimal:
price = Decimal(unit_price)
tax = Decimal(tax_rate)
subtotal = price * qty
tax_amount = (subtotal * tax).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
return subtotal + tax_amount
def float_trap() -> None:
print(0.1 + 0.2) # 0.30000000000000004
print(Fraction(1, 10) + Fraction(2, 10)) # 3/10 exacto
def truthiness() -> None:
for value in [0, 1, "", "x", [], [0], None]:
print(repr(value), "->", bool(value))
if __name__ == "__main__":
print(invoice_line("19.99", 3, "0.0825"))
float_trap()
truthiness()Lo que esto demuestra:
Decimalconstruido a partir de cadenas evita artefactos binarios de flotantesquantizecontrola el redondeo para la visualización de monedaFractionmantiene los números racionales exactos- La veracidad sigue reglas estándar: cero, vacío y
Noneson falsos
Inmersión Profunda
Cómo Funciona
- int - Precisión arbitraria; solo limitada por la memoria.
- float - IEEE 754 doble; rápido pero inexacto para muchos decimales.
- Decimal - Punto flotante base-10 con precisión configurable y modos de redondeo.
- bool - Subclase de
int;True == 1,False == 0. - Precedencia de operadores - PEMDAS estándar; usa paréntesis para mayor claridad.
Operadores de un Vistazo
| Operador | Significado | Notas |
|---|---|---|
/ | División verdadera | Siempre devuelve float |
// | División entera (floor division) | Redondea hacia el infinito negativo |
% | Módulo | El signo sigue al divisor en Python 3 |
** | Potencia | Los enteros grandes pueden crecer rápidamente |
& | ^ << >> | Bit a bit | Solo en enteros |
Notas de Python
import math
math.isclose(0.1 + 0.2, 0.3) # preferir sobre == para flotantes
int("ff", 16) # conversión de base
float("nan") != float("nan") # NaN no es igual a sí mismoProblemas Comunes (Gotchas)
- Igualdad de flotantes -
0.1 + 0.2 == 0.3es False. Solución:math.iscloseoDecimal. - División entera en negativos -
-7 // 3es-3, no-2. Solución: Recuerda que redondea hacia-inf. - Decimal a partir de flotante -
Decimal(0.1)hereda la imprecisión del flotante. Solución:Decimal("0.1"). - bool es int -
True + Truees igual a 2. Solución: No uses booleanos en sumas a menos que sea intencional. - Entero grande a flotante - Convertir enteros enormes a flotante pierde precisión. Solución: Permanece en
into usaDecimal.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Decimal | Dinero, impuestos, facturación | Matemáticas vectoriales científicas intensivas |
Fraction | Matemáticas racionales exactas | Necesitas funciones trascendentales |
numpy.float64 | Arrays numéricos | Aritmética simple de scripts |
Solo int | Conteo, indexación | Necesitas valores fraccionarios |
Preguntas Frecuentes (FAQs)
¿Por qué 0.1 + 0.2 no es igual a 0.3?
Los flotantes binarios no pueden representar 0.1 exactamente. La suma está cerca pero no es idéntica; usa isclose o Decimal.
¿Cuándo debo usar Decimal en lugar de float?
Decimal para moneda y en cualquier lugar donde los humanos esperen redondeo en base 10. float para ciencia, ML y rendimiento.
¿Qué es la veracidad (truthiness)?
Los objetos definen su veracidad a través de __bool__ o __len__. Los contenedores vacíos y los números cero son falsos; la mayoría de los demás objetos son verdaderos.
¿Cómo redondeo para mostrar?
from decimal import Decimal, ROUND_HALF_UP
Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)¿Qué hace // con los números negativos?
Redondea hacia abajo (floor): -7 // 3 es -3 porque floor(-2.33) es -3.
¿Es bool un entero real?
bool hereda de int. isinstance(True, int) es True, pero usa booleanos solo para lógica, no para contar.
¿Cómo analizo la entrada numérica del usuario de forma segura?
Envuelve int() / Decimal() en try/except ValueError, o valida con una biblioteca de esquemas en los límites de la API.
¿Para qué sirve divmod?
Devuelve (a // b, a % b) en una sola llamada; común para paginación y aritmética de relojes.
¿Pueden los enteros ser infinitamente grandes?
Sí, en Python 3; el límite práctico es la memoria. La criptografía y las operaciones con bigint dependen de esto.
¿Cómo funcionan los operadores bit a bit?
Operan sobre patrones de bits de enteros; útiles para indicadores, máscaras y protocolos de bajo nivel.
Relacionado
- Variables, Tipos y Tipado Dinámico - tipos de objetos e identidad
- Flujo de Control - veracidad en condicionales
- Cadenas y f-strings - formateo de números en la salida
- Conceptos Básicos de Anotaciones de Tipo - anotando tipos numéricos
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.