Este planteamiento servira, hago la consulta
Introducción y primeros pasos con Python
¿Por qué aprender a programar en Python?
Accede a la versión más actualizada de este contenido
Herramientas del curso
Tu primer programa con Python
Herramientas para programar con Python
Playgrounds: Te doy la bienvenida a los ejercicios interactivos
Variables
Playgrounds: Modifica el valor de una variable
Quiz: Introducción y primeros pasos con Python
Tipos de datos en Python
Tipos de datos
Strings
Numbers
Booleans
Transformación de tipos
Playgrounds: Imprime el formato adecuado
Operadores y condicionales
Operadores aritméticos
Operadores de comparación
Comparación de números flotantes
Operadores lógicos: and y or
Operador lógico not
Condicionales
Proyecto: condicionales
Playgrounds: Identifica si un número es par o impar
Listas y diccionarios
String recargado
Indexing y slicing
Listas
Métodos de listas
Playgrounds: Agrega, modifica y elimina elementos de una lista
Tuplas
Proyecto: tuplas
Diccionarios: definición y lectura
Diccionarios: inserción y actualización
Playgrounds: Agrega, modifica y elimina elementos de un diccionario
Ciclos
Loops: While
Loops: For
Playgrounds: Agrega solo los números positivos de una lista
Ciclos anidados
¡Es tu turno: crea un tutorial!
Cierre
Proyecto: aplicando ciclos
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Nicolas Molina
Aportes 205
Preguntas 46
Este planteamiento servira, hago la consulta
tres formas de comparar flotates:
Esta clase en particular me pareció complicada de entender, el profesor no explica a qué se refiere con “format” y la explicación deja mucho que desear.
La razon de porque la division no es exacta es:
Python utiliza la IEEE 754-2008 para la representación de números de punto flotante, que es la norma internacional para la representación y el cálculo de números de punto flotante. Sin embargo, esta norma tiene sus limitaciones y, por lo tanto, python también tiene limitaciones en la representación y el cálculo de números de punto flotante.
Una de las limitaciones principales de la IEEE 754-2008 es que sólo permite representar un número finito de dígitos decimales. Esto significa que, en algunos casos, los números de punto flotante no se pueden representar de forma exacta y se producen errores de redondeo o truncamiento. Estos errores pueden ser pequeños y pueden no tener un impacto significativo en el cálculo, pero en algunos casos pueden ser muy grandes y afectar significativamente al resultado final.
Algo que se va del alcance de la clase pero es bueno saber es que ese 1.1+2.2 no da 3.3 en la computadora ya que lo que hace esta es pasar esos 1.1 y 2.2 a binario y sumarlos, pero en binario 1.1 y 2.2 tienen infinitos decimales, por lo que la computadora corta hasta cierto digito y asi los suma, generando un error que crece como bola de nieve, se le conoce como error de punto flotante.
Usando la función round(valor,decimales)
x = 3.3
print(x)
y = round((1.1 + 2.2),1)
print(y)
print(x==y)
y_str = format(y, “.2g”)
Quiero aportar algunos datos sobre esta función.
.2g significa 2 digitos significativos, osea si el numero es 1.0, el 0 no lo toma en cuenta
.2f este si es para decimales, muestra 2 decimales.
y se puede realizar otras cosas como cambiarlo a moneda ‘$,.2f’
Como podemos comparar flotantes? para eso tenemos 3 métodos con las siguientes funciones:
format()
→ Esta función formatea un string de forma flexible, de esta forma podemos quitar decimales a un Nro float, para después compararlo con otros númerosabs()
→ obtiene el valor absoluto de un numero, que es la distancia entre el nro y el 0, es decir el valor nro sin considerar su signoround()
→ Se utiliza para redondear un número a un determinado número de dígitos decimales. Puede tomar uno o dos argumentos: el 1er argumento es el número que se va a redondear y el 2do argumento, que es opcional, es el número de decimales a los que se quiere redondear.Redondear un número a un entero:
num = 4.6
rounded_num = round(num)
print(rounded_num) # Salida: 5
Redondear un número a dos decimales:
num = 3.14159265
rounded_num = round(num, 2)
print(rounded_num) # Salida: 3.14
Pienso que al tratarse de números es mejor utilizar las formas matematicas para operarlos
Hmmm siendo honesto, el enfoque matemático, si bien es cierto que aplica matemática, no es tan directo como cuando se aplica una función como round() y redondear a 2 decimales. Esto teniendo en cuenta referencias de otros lenguajes de programación.
Revisando algunos ejemplos en línea, veo que ese método no funciona según lo esperado, por lo que se recurre a aplicar formatos.
Aquí dejo el link que encontré mencionando el tema.
Es importante aclarar que es un valor Absoluto o la función abs()
En forma Matematica y lo mas sencillo posible es que tomas el valor del digito sin importar su signo, en este caso positivo o negativo, por ejemplo 5 - 7 = -2 ; 7 - 5 = 2, el valor absoluto simplemente toma el resultado de la operación y le quita el signo, dejándolo como un valor absoluto, creo que es necesario recalcar esto porque no todas las personas están claros de esos detalles matematicos en cursos introductorios.
https://ellibrodepython.com/float-python
comparto este articulo me pareció super para complementar
Esto resolvería la comparación entre dos tipos de variables float con un decimal…
a=3.3
b = 1.1 + 2.2
print (round(a,1)==round(b,1))
también podemos usar la función math
import math
a = 0.1 + 0.1 + 0.1
b = 0.3
if math.isclose(a, b):
print("Los valores son aproximadamente iguales")
else:
print("Los valores son diferentes")
""" formas de comparar floats """
x = 7.7
print("x =", x)
y = 3.4 + 4.3
print("y = 3.4 + 4.3 =", y)
print(f"x == y: {x == y}")
# Haciendo uso de strings
print("*" * 35)
print("Haciendo uso de strings")
print("x =", x)
y_str = format(y, ".2g")
print("y_str =", y_str)
print(f"x == y: {str(x) == y_str}")
# Comparando por margen de error
print("*" * 35)
print("Comparando por margen de error")
print("x =", x)
print("y =", y)
error = 0.001
print(f"x == y, considerando un margen de error de {error} : {abs(x - y) < error}")
Que genial explicación
De acuerdo con RealPython, .2g determina el número total de dígitos significativos antes y después del punto decimal:
La TOLERANCIA se entiende más con números grandes. Supongamos que tengo:
x = 33 000 000 ⇒ treinta y tres millones de pesos
y = 33 000 003 ⇒ treinta y tres millones tres pesos
Son cifras muy similares, no obstante la última cifra de ‘y’ el ‘3’ hace que no sean iguales.
Pero tengo que hacer contabilidad de los gastos y el presupuesto es de 33 millones y no de 33 millones tres, pero hipotéticamente me doy cuenta de que no me importa perder 3 pesos pero sí me importa perder 5 pesos porque ya estaría perdiendo mucho (hipotéticamente).
Aquí es donde entra la tolerancia, no quiero tener en cuenta los gastos menores a 5 pesos pero si los que son de 5 pesos en adelante entonces digo que:
TOLERANCIA = 5
Ahora hago la resta y guardo en la variable r
r = (33 000 000 - 33 000 003) < 5
El resultado es -3
r ⇒ -3
Aquí llamamos al método abs(), el cual ignora el signo que tenga el número y solo toma el número así:
abs( r ) ⇒ 3
Finalmente lo comparamos con nuestra tolerancia, en este ejemplo con la cantidad de pesos que estamos dispuestos a perder
(3 < 5) ⇒ True
Al ser el número que tenemos de más (3) menor que el número que NO estamos dispuestos a perder, es decir la TOLERANCIA, hacemos aproximación y decimos que
x == y
Como ves hacemos la misma operación de la clase solo que desglosada en partes.
Esto es lo mismo que hacen en el ejemplo y esta técnica se aplica para generalmente para números muy pequeños como los decimales de la variable ‘y’ de la clase donde son cantidades tan pequeñas que ignorarlas no afecta al resultado.
Algo nuevo que leí en los comentarios es que Python utiliza la norma IEEE754-2008 para hacer cálculos de números decimales, lo cual ocasiona que el resultado final no sea exactamente igual a cuando se usan cálculos matemáticos. No se cual es el objetivo, pero supongo que se verá más adelante y voy a investigar por mi cuenta.
El uso de tolerancias me parece interesante para comparar números, además que puede ser aplicable a varias ramas de la ciencia, como la Ingeniería (industrial, química), en la cual muchas veces utilizamos tolerancias, márgenes de error, etc. para muchas variables.
Considero que es mejor realizarla de forma matemática para no seguir confundiendo a las personas o creando mas miedo con los números.
Aunque claro que si estamos aquí es por que realmente nos gusta y nos apasionan estas materias.
Estuve leyendo algunos comentarios y tengo para decir lo siguiente:
Muchas veces los profesores no nos van a entregar toda la información. También tenemos que buscar y averiguar cosas por nosotros mismos, para eso existe la documentación. Muchas veces ellos solo nos dan las bases, eso hace parte del ejercicio de aprendizaje. Nisiquiera en las mejores universidades hacen eso. Empoderense de su proceso.
Tambien leí mucho de compañeros que se preguntaban porque el profesor no solo redujo el numero de decimales con float. Me di a la tarea de averiguarlo y encontré la siguiente respuesta:
La representación de punto flotante no es exacta y los errores de redondeo pueden acumularse en operaciones más complejas.
La aproximación basada en tolerancia (como la que mencionó el profe) es más general y robusta, ya que toma en cuenta los posibles errores de redondeo y la naturaleza imprecisa de los cálculos con números de punto flotante. Utilizar una tolerancia permite considerar valores como “cercanos” si están dentro de un rango aceptable de diferencia, en lugar de depender de la igualdad exacta de las representaciones numéricas.
😃
# Así se usa la función ROUND para comparar
x = 3.3
y = 1.1 + 2.2
print("Valor de x: ",x)
print(" ")
print("Valor de y: ",y)
print(" ")
print("x == y: ",x == round(y,1)) # x == y: True
¿Por qué no suma 3.3?
Se debe a la imprecisión de la representación binaria de los números decimales 1.1 y 2.2 y cómo se manejan las operaciones aritméticas en el lenguaje de programación.
Detalle.
Cuando se realiza la suma de 1.1 y 2.2 en un lenguaje de programación, los números se convierten a su representación binaria interna y luego se realiza la operación. Sin embargo, debido a las limitaciones del formato binario, el resultado puede contener pequeños errores.
¿Qué puedo hacer?
Puedo considerar técnicas como redondeo o uso de tipos de datos más precisos cuando se requiere una mayor precisión en los cálculos decimales.
x = 1.1 + 2.2
y = 3.3
print(round(x,1) == y)
y_str = format(y, ".2g")
: Esta línea utiliza la función format()
para formatear el valor de la variable y
con dos dígitos significativos. El especificador ".2g"
indica que se debe usar el formato general (sin notación científica) y se deben mostrar dos dígitos significativos. El resultado se guarda en la variable y_str
.
print('str =>', y_str)
: Esta línea imprime en la consola el texto “str =>” seguido del valor de la variable y_str
. En este caso, imprimirá “str => 3.3”.
print(y_str == str(x))
: Esta línea compara el valor de la variable y_str
con el valor de la variable x
convertido a una cadena de texto utilizando str()
. Si ambos valores son iguales, la expresión será True
; de lo contrario, será False
. En este caso, la expresión evaluará a True
si el valor de x
es igual a “3.3” como una cadena de texto.
En resumen, el código formatea un número y
con dos dígitos significativos y lo guarda como una cadena de texto en y_str
. Luego, imprime ese valor formateado y compara si es igual a la representación en cadena de texto del valor de x
. Si son iguales, imprimirá True
.
La comparación de flotantes por el método de strings y matemático; son muy interesantes ambos. Es de anotar, que si solo le colocamos a la tolerancia un 0.1; ya estamos aprobando (True) la comparación ; ya que la suma de los flotantes tiene 14 ceros hacia la derecha. Para que fuera Falsa tendríamos que colocarle quince ceros.
Hay que ser mas precisos a la hora de explicar, al momento de usar la función format(), el argumento ideal para el ejercicio debio ser “.2f”, dado que de esta forma se redondea a dos decimales, en cambio al usar el “.2g”, hablamos de conceptos como dígitos significativos, redondeo etc, que como se pudo mostrar en el ejemplo, según lo que comenta el instructor, el uso “.2g” para tomar solo dos decimales pero en el resultado le sale “3.3” el cual solo tiene un decimal. Estos detalles pueden confundir a personas que son muy curiosas, me he pasado mucho tiempo buscando explicación a porque le sale “3.3” si el dice que lo redondea a 2 decimales, recurrí a chatgpt y ya con eso pude aclarar mi idea.
Profesor no entendí la forma matemática, usted explica muy bien pero ceo que omitió muchas cosas
Debo admitir que este tema si me dio duro…
Lo hice utilizando la formula round y un solo decimal y al compáralos el resultado es True.
Desde algo tan básico como esto, se nota el esfuerzo que le ponen a los cursos, muchas gracias, me encanto la clase
No me había percatado de esa situación en python por números flotantes. Se me hizo curioso.
Me parece muy interesante el Formato g de python, aquí mi resumen con la explicación de porque tenemos que transformar la variable x en string.
Buenas tardes, a mi me resulto mucho mas facil de esta forma
x = 3.3
print(x)
y = 1.1 + 2.2
y = (round(y, 2))
print(y)
print(x == y)
Me parece bastante ùtil la tecnica que ha utilizado el docente para igualar los valores de 3.3 y 3.300000000004.
Y también importante el uso de la función abs()
Por más que repito la clase, se me hace muy complejo y no logro entender.
Otra forma que encontré para solucionar este problema es a función round()
,en Python se utiliza para redondear un número a una cierta cantidad de dígitos decimales o a un número entero.
x = 3.3000000000000003
rounded_x = round(x, 2)
print(rounded_x)
'''
print(round(y,2))
La tolerancia en matemáticas es la cantidad de error que se puede permitir en un cálculo o medición sin que afecte significativamente el resultado final. En Python, la tolerancia se puede aplicar en comparaciones de números de punto flotante utilizando la función isclose()
del módulo math. Esta función compara dos números y devuelve True si son iguales dentro de una tolerancia dada. Por ejemplo, para comparar si dos números son iguales dentro de una tolerancia de 0.001, se puede usar el siguiente código:
import math
a = 0.1 + 0.1 + 0.1
b = 0.3
if math.isclose(a, b):
print("Los valores son aproximadamente iguales")
else:
print("Los valores son diferentes")
En este caso, la función isclose()
devuelve True porque los valores de a y b son iguales dentro de una tolerancia de 0.001.
Otra forma de aplicar la tolerancia es redondeando los números a un número determinado de decimales utilizando la función round()
. Por ejemplo, para comparar si dos números son iguales dentro de una tolerancia de 0.01 y redondearlos a dos decimales, se puede usar el siguiente código:
x = 3.3
y = 1.1 + 2.2
if round(x, 2) == round(y, 2):
print("Los valores son aproximadamente iguales")
else:
print("Los valores son diferentes")
a = y-x
print(a)
print(y-a)
print(y-a == x)
Otra forma de lograr esa comparación fue con la función round, donde redondee el y a 1 decimal.
#round
print(x == round(y,1))
ay no! no me gustan las matemática, pero no me rendiré
tolerance=0.00001
#comparar
print(abs(x-y)<tolerance)
#abs valor absoluto
a
Gracias por el aporte me quedo con este método.
x = 3.3
y = 1.1 + 2.2
print(round(y, 1))
print(x + y)
Tengamos en cuenta que la explicación nos lleva a entender el porqué. Sin embargo, no es lo más práctico, en las labores diarias haces un Round y después de la coma (,) eliges cuantos decimales quieres y listo.
float1 = Round(3.322, 1)
float2 = 3
print (float1 + float2)
Yo lo hice de esta forma y me funcionó
x = 3.3
print(x)
y = round(1.1 + 2.2, 1)
print(y)
print(x == y)
y_str = format(y, ‘.2g’)
print(y_str)
print(y_str == str(x))
Formas de hacer comparaciones
1. Comparacion con la forma precision decimal (String):
2. Comparación con precision matemática:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?