¿Trabaja con tipos de datos numéricos en Python? Suba de nivel aprendiendo las diferentes formas de redondear números en Python.
La mayoría de los conjuntos de datos del mundo real contienen características tanto numéricas como categóricas. Existe una amplia gama de características numéricas, desde lecturas de sensores hasta tipos de cambio de divisas, señales biomédicas y mucho más.
Al trabajar con valores numéricos, puede que necesite redondear estos valores a una precisión fija por razones como:
- Garantizar un formato coherente
- Facilitar el almacenamiento y el procesamiento
En este tutorial, aprenderemos las diferentes formas de redondear un número a una precisión específica, redondear números hacia arriba y hacia abajo al número entero más cercano, y mucho más.
Empecemos.
Cómo redondear números utilizando la función incorporada round()
El método más común para redondear números en Python es utilizar la función incorporada round(). Empecemos por aprender su sintaxis:
round(num, ndigits)
Aquí
num
es el número que desea redondearndigits
es un parámetro opcional con un valor por defecto deNinguno
. Es el número de posiciones al que redondear el número. Sindigits
= 2, num se redondea a dos lugares después del punto decimal.- La función
round
() devuelvenum
redondeado a la precisión dendigits
después del punto decimal.
Ejemplos de uso de la función round() de Python
Vamos a codificar algunos ejemplos para entender cómo funciona la función round( )
.
Como se ha mencionado, ndigits
es opcional. Así que cuando llamamos a round
() sólo con el número, el número se redondea al entero más cercano.
número = 7.123456
redondeado = round(número)
print(redondeado)
# Salida: 7
Veamos ahora algunos ejemplos en los que especificamos la precisión.
Con ndigits
establecido en 2, número
se redondea a dos decimales (décimo lugar):
número = 7.123456
redondeado = round(número, 2)
print(redondeado)
# Salida 7.12
Con ndigits
establecido en 3, el número
se redondea a tres decimales (centésima):
número = 7.123456
redondeado = redondeado(número, 3)
print(redondeado)
# Salida: 7.123
También puede utilizar round()
para redondear números negativos:
número = -3.4
redondeado = redondea(número)
print(redondeado)
# Salida: -3
Aquí, la función redondea -3,4 a -3, el entero más cercano.
Redondeo al lugar más cercano de las decenas y las centenas
¿Sabía que los ndigits
también pueden tomar valores negativos?
Sí, puede llamar a la función round(
) con valores negativos para ndigits
. Cuando lo hace, el redondeo se produce a la izquierda del punto decimal en lugar de a la derecha.
¿Qué significa esto? Veamos algunos ejemplos.
Cuando establecemos ndigits en -1, el número se redondea a la decena más cercana.
número = 7.123456
redondeado = redondeado(número, -1)
print(redondeado)
# Salida: 10.0
Y llamando a la función round()
con ndigits fijado en -2 redondea el número 77.123456 a la centena más cercana, que en este caso es 100.0.
número = 77.123456
redondeado = round(número, -2)
print(redondeado)
# Salida: 100.0
Hasta ahora, la función round(
) parece seguir los principios generales de redondeo que hemos aprendido en matemáticas en la escuela. Pero no siempre es así.
Existen algunas limitaciones con los números de coma flotante . Así que puede ver algunos resultados inesperados al redondear. Otra advertencia interesante es el redondeo del banquero.
¿Qué es el redondeo bancario?
Inicie un REPL de Python y pruebe el siguiente ejemplo:
>>> round(1.5)
2
Vemos que round(1.5 )
devuelve 2 (como era de esperar). Entonces, ¿qué debería devolver round(2.5 )
?
>>> round(2.5)
2
Interesante, ¿verdad? Tanto round(1 ,5)
como round
(2,5) devuelven 2. Pero, ¿cómo y por qué?
Internamente, la función redondear funciona así: cualquier valor que esté a medio camino entre dos enteros se redondea al entero par más cercano. Esto se denomina redondeo bancario o estrategia de redondear la mitad a par.
Sabemos que la función round(
) es suficiente para tareas de redondeo sencillas. Pero a veces, puede que necesite redondear un número hacia arriba o hacia abajo al entero más cercano.
Entonces, ¿cómo hacerlo? Vamos a aprenderlo en la siguiente sección.
Cómo redondear números en Python
Para redondear un número al entero más cercano, puede utilizar:
Uso de math.ceil
La función ceil( )
(o función techo) funciona así: Redondea un número al entero más pequeño que sea mayor que el número.
El siguiente fragmento muestra cómo utilizar la función ceil( )
para redondear al alza el número 3,2:
import math
número = 3.2
redondeado_arriba = math.ceil(número)
print(redondeado_arriba)
# Salida: 4
Uso del módulo decimal
Hasta ahora, hemos utilizado el tipo de datos incorporado float. Pero para ciertas aplicaciones en computación científica y finanzas, necesitamos una precisión mucho mayor. Y para ello, Python incluye el módulo decimal que proporciona:
- Aritmética de coma flotante más precisa
- Pruebas de igualdad fiables
- Control más fino sobre el nivel de precisión (la precisión por defecto es de 28 posiciones)
Para ver el contexto actual, utilice getcontext()
como se muestra:
from decimal import getcontext
contexto_actual = getcontext()
print(contexto_actual)
Debería poder ver la precisión actual y el modo de redondeo, entre otros:
# Salida
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
may=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
Para redondear un número, puede utilizar quantize()
especificando:
- La precisión (0,0 ya que queremos redondear al entero más cercano) y
- El modo de redondeo:
ROUND_CEILING
from decimal import Decimal, ROUND_CEILING
número = Decimal('3.2')
redondeado_arriba = número.cuantizar(Decimal('0'), redondeo=ROUND_CEILING)
print(redondeado_arriba)
# Salida: 4
Aquí, el número 3.2 ha sido redondeado al entero 4 más cercano.
Cómo redondear números hacia abajo en Python
Veamos ahora cómo redondear números hacia abajo en Python. De forma similar al proceso de redondeo hacia arriba, podemos utilizar los módulos math o decimal.
Utilizando math.floor
La función floor()
del módulo math funciona así: Redondea hacia abajo un número al mayor entero que sea menor que el número.
Tomemos el siguiente ejemplo:
import math
número = 3,8
redondeado_abajo = math.floor(número)
print(redondeado_abajo)
# Salida: 3
Aquí, la función floor(
) redondea por defecto el número de coma flotante 3.8 a 3.
Uso del módulo decimal
Para redondear por defecto un número, puede utilizar quantize()
ajustando el modo de redondeo a ROUND_FLOOR
.
from decimal import Decimal, ROUND_FLOOR
número = Decimal('3.8')
redondeado_abajo = número.cuantizar(Decimal('0'), redondeo=ROUND_FLOOR)
print(redondeado_abajo)
# Salida: 3
Como se ve, 3,8 se ha redondeado a 3.
Errores comunes que hay que evitar al redondear números
Ya hemos visto que la función round(
) redondea la mitad a par, lo que no siempre es deseable. Existen otros errores comunes que hay que evitar al redondear números en Python:
- Comparación de igualdad incorrecta: El redondeo de números suele introducir errores de redondeo. Si intenta realizar una comparación de igualdad entre un resultado redondeado con otro valor, la comprobación de igualdad fallará (casi siempre) debido a la variación de la precisión. Por tanto, intente evitar las comprobaciones de igualdad entre números en coma flotante y números redondeados en coma flotante. Si la comparación es necesaria, introduzca un umbral de tolerancia.
- Pérdida de información: Es posible que desee que ciertos datos, como las lecturas de los sensores en diferentes franjas horarias, se capturen con gran precisión. Redondear esos datos a menos decimales provoca una pérdida de información y un análisis incorrecto.
- Redondeo de resultados intermedios: A menudo tendrá varios pasos como parte del cálculo. Utilice una precisión coherente en todos los pasos. Además, evite redondear en los pasos intermedios para evitar que los errores de redondeo se agraven.
Mejores prácticas para redondear números en Python
Enumeremos algunas de las mejores prácticas a seguir para redondear números en Python:
- Elija el tipo de datos correcto: Elija entre los tipos de datos float y decimal dependiendo de la aplicación. Si necesita realizar aritmética de coma flotante de alta precisión, elija el tipo de datos decimal.
- Utilice niveles de precisión coherentes: Establezca niveles de precisión coherentes para los números decimales en todo el programa para evitar errores de redondeo inesperados.
- Documente las técnicas de redondeo: En las aplicaciones del mundo real que implican datos como moneda y lecturas de sensores, es importante disponer de una técnica de redondeo coherente y documentada.
Para terminar
Concluyamos el tutorial con un rápido repaso de lo que hemos aprendido:
- Puede utilizar la función incorporada
round
() con esta sintaxisround(num, ndigits)
. Cuando utilice la funciónround
(), debe tener en cuenta la estrategia de redondeo del banquero. Así, redondea los números exactamente entre dos enteros al entero par más cercano. - Puede utilizar las funciones
ceil()
yfloor()
del módulo matemático para redondear hacia arriba y hacia abajo un número dado al entero más cercano, respectivamente. - Cuando necesite realizar aritmética de coma flotante de alta precisión, utilice el módulo decimal. Puede redondear los números con la precisión y la estrategia de redondeo requeridas.
- Debe ser consciente de los escollos comunes con el redondeo de números en Python. Entre ellos se incluyen la pérdida de información por el redondeo, el redondeo de resultados en pasos intermedios y el uso de diferentes precisiones en distintas partes del código.
- Las mejores prácticas incluyen elegir el tipo de datos adecuado en función de la aplicación y documentar niveles de precisión coherentes.
A continuación, aprenda a realizar la división por el suelo en Python.