elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Valores incorrectos [python]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Valores incorrectos [python]  (Leído 4,966 veces)
criskapunk

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Valores incorrectos [python]
« en: 15 Octubre 2010, 22:29 pm »

Buenas chicos,

Estaba resolviendo este ejercicio y me surgió un problema:

Citar
Dada una cantidad de dinero, indicar como repartir el vuelto de manera que se utilice la menor cantidad de monedas.

Acá mi código:

Código
  1. b = (100, 50, 20, 10, 5, 2, 1, .5, .25, .1, .05)
  2.  
  3. v = float(raw_input("Ingrese vuelto: "))
  4. i = 0
  5. j = 0
  6. l = len(b)
  7.  
  8. while i != l:
  9.    while v - b[i] >= 0:
  10.        v -= b[i]
  11.        j += 1
  12.    if j != 0:
  13.        print j, " billetes/monedas de ", b[i]
  14.        print "El valor restante es: ", v    # Esta unicamente para comprobar los resultados
  15.    j = 0
  16.    i += 1

La salida del script utlizando como valor 1807.35 es:

Código:
18  billetes/monedas de  100
El valor restante es:  7.35
1  billetes/monedas de  5
El valor restante es:  2.35
1  billetes/monedas de  2
El valor restante es:  0.35
1  billetes/monedas de  0.25
El valor restante es:  0.0999999999999
1  billetes/monedas de  0.05
El valor restante es:  0.0499999999999

Por qué después de hacer la resta 0.35-0.25 devuelve 0.09 y no 0.1? :-\

Un saludo y gracias ;)



« Última modificación: 16 Octubre 2010, 01:27 am por Leo Gutiérrez. » En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Valores incorrectos
« Respuesta #1 en: 15 Octubre 2010, 22:44 pm »

No tengo idea, pero .... a mi también me pasa ;-)
Tiene que ser tema de como python trata los valores de coma flotante, si ejecutas 0.35-0.25 te devuelve 0.099999999999999978 en lugar de 0.1, lo mismo pasa con otros valores pequeños.

Saludos



En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
criskapunk

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: Valores incorrectos
« Respuesta #2 en: 15 Octubre 2010, 23:40 pm »

Si, debe ser por eso. No me había fijado cuanto devolvía la resta (Eso me pasa por suponer :P)

Lo resolví así:

Código
  1. b = (100, 50, 20, 10, 5, 2, 1, 0.5, 0.25, 0.1, 0.05)
  2.  
  3. v = float(raw_input("Ingrese vuelto: "))
  4. i = 0
  5. j = 0
  6. l = len(b)
  7.  
  8. while i != l:
  9.    while v - b[i] >= 0:
  10.        # v -= b[i]
  11.        v = (v * 10 - b[i] * 10) / 10
  12.        j += 1
  13.    if j != 0:
  14.        print j, " billetes/monedas de ", b[i]
  15.    j = 0
  16.    i += 1
  17. if v != 0:
  18.    print "Con %.2f centavos imposibles de devolver" % v

Muchas gracias Novlucker! Un saludo ;)
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Valores incorrectos
« Respuesta #3 en: 16 Octubre 2010, 00:13 am »

Utiliza la funcion round(valor,ndigitos)

Código
  1. b = (100, 50, 20, 10, 5, 2, 1, .5, .25, .1, .05)
  2.  
  3. v = float(raw_input("Ingrese vuelto: "))
  4. i = 0
  5. j = 0
  6. l = len(b)
  7.  
  8. while i != l:
  9.    while v - b[i] >= 0:
  10.        v -= b[i]
  11.        v = round(v,2)
  12.        j += 1
  13.    if j != 0:
  14.        print j, " billetes/monedas de ", b[i]
  15.        print "El valor restante es: ", v    # Esta unicamente para comprobar los resultados
  16.    j = 0
  17.    i += 1

Valores de salida:
Código:
Ingrese vuelto: 1807.35
18  billetes/monedas de  100
El valor restante es:  7.35
1  billetes/monedas de  5
El valor restante es:  2.35
1  billetes/monedas de  2
El valor restante es:  0.35
1  billetes/monedas de  0.25
El valor restante es:  0.1
1  billetes/monedas de  0.1
El valor restante es:  0.0
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Valores incorrectos [python]
« Respuesta #4 en: 16 Octubre 2010, 02:59 am »

Código
  1. bi = int(raw_input('Ingresa dinero: '))
  2.  
  3. for eu in [500, 200, 100, 50, 20, 10, 5, 2, 1]:
  4.    print '%d billetes de %d' % ((bi / eu), eu)
  5.    bil = bi % eu
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Valores incorrectos [python]
« Respuesta #5 en: 21 Octubre 2010, 16:16 pm »

Código
  1. bi = int(raw_input('Ingresa dinero: '))
  2.  
  3. for eu in [500, 200, 100, 50, 20, 10, 5, 2, 1]:
  4.    print '%d billetes de %d' % ((bi / eu), eu)
  5.    bil = bi % eu

te falto .5, .25, .1, .05, .01
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Valores incorrectos [python]
« Respuesta #6 en: 21 Octubre 2010, 17:49 pm »

Lo hice el año pasado para el instituto.
Código
  1. # coding: utf-8
  2. # Obtiene el desglose en billetes y monedas de una cantidad de Euros
  3.  
  4. # Creamos y obtenemos las variables
  5. iMoney = round(float(raw_input("Dame una cantidad de Euros con 2 decimales:")),2)
  6.  
  7. # Recorremos la cantidad de posibles billetes o monedas
  8. for nCantidad in [500,200,100,50,20,10,5,2,1,0.5,0.2,0.1,0.10,0.05,0.02,0.01]:
  9. if (iMoney // nCantidad != 0):
  10. if nCantidad >= 5: sNombre = "billete(s)"
  11. if nCantidad < 5: sNombre = "moneda(s)"
  12. print "%d %s de %.2f Euros" % (iMoney // nCantidad, sNombre, nCantidad)
  13. iMoney -= (iMoney // nCantidad * nCantidad)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines