Python - Resta No da numero exacto

 
Vista:
sin imagen de perfil
Val: 6
Ha disminuido su posición en 20 puestos en Python (en relación al último mes)
Gráfica de Python

Resta No da numero exacto

Publicado por Santiago (2 intervenciones) el 16/02/2021 10:42:37
Hola recién empiezo a hacer algo en Python y mientras probaba algunas cosas me encontré unos resultados extraños al meno para mi, por lo que me fui a la consola a ver si es que yo hacia algo mal y los resultados fueron los mismos, a continuación

Captura-de-pantalla-2021-02-16-103934

por qué no me da el número exacto? y por qué en unos casos da exacto y en otros no? o tendré que redondear para ello?, esto ultimo no lo quería hacer pues eso me limitaría la exactitud de los resultados en otros casos.
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Joan
Val: 26
Ha disminuido su posición en 10 puestos en Python (en relación al último mes)
Gráfica de Python

Resta No da numero exacto

Publicado por Joan (5 intervenciones) el 16/02/2021 11:49:00
Los números no enteros se representan en el ordenador de forma aproximada. Para representarlos de forma exacta, se necesitarían infinitos decimales. Esto es debido a que se usa base 2 como sistema de representación.

En base 10 (la que solemos utilizar) a veces aparecen números con infinitos decimales (periódicos), como por ejemplo al dividir 1/3, que sale 0.333... la secuencia de 3 no termina nunca.

En base 2 este problema aparece mucho más a menudo. Números que en base 10 tendrían un solo decimal como 0.2, al pasarlos a base 2 presentan una secuencia infinita de decimales (sería 0.0011001100110011....). De hecho, los únicos números que tienen representación "exacta" en base 2 son los que son suma de potencias de 0.5, como 0.5, 0.25, 0.125, 0.75, etc. (todos terminan en 5).

Esto es un problema en el software bancario, ya que típicamente se trabaja con céntimos que, al convertirse a binario, dan una representación infinita. El ordenador no puede obviamente guardar infinitos bits, así que "corta" la secuencia para dejarla finita, provocando un error de redondeo. El error suele ser pequeño, pero muchos errores sumados puede provocar el descuadre de cuentas en el banco.

Para este tipo de software en python puedes usar el módulo decimal, que representa las cantidades con céntimos de otra forma que no produzca esos errores. A cambio la representación es más ineficiente y los cálculos más lentos.

Si no te importa tanto el valor almacenado en la variable (que puede contener un error de redondeo) como su representación por pantalla, es decir, si lo que quieres es que muestre 0.02 aunque internamente esté almacenando un número binario que no es exactamente 0.02, sino 0.02000000000000135, entonces basta que indiques a la hora de imprimirlo que redondee. Esto puedes hacerlo así:

1
print("El resultado es {:f}".format(resultadio))

Por defecto te lo muestra redondeado a 6 decimeles, pero puedes controlar la cantidad de decimales que quieres mostrar, por ejemplo, dos decimales:

1
print("El resultado es {:.2f}".format(resultadio))

Si quieres que Python redondee automáticamente a la cantidad apropiada de decimales, según el número a mostrar, puedes usar:

1
print("El resultado es {:g}".format(resultadio))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 20 puestos en Python (en relación al último mes)
Gráfica de Python

Resta No da numero exacto

Publicado por Santiago (2 intervenciones) el 16/02/2021 12:04:10
Muchas gracias, más claro el agua
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jaime
Val: 526
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Resta No da numero exacto

Publicado por Jaime (136 intervenciones) el 16/02/2021 23:02:07
Yo sabía que pasaba eso, pero no sabía el por qué!
Gracias compañero. Esto no sólo pasa con python, también con Javascript.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar