Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: criskapunk en 15 Octubre 2010, 22:29 pm



Título: Valores incorrectos [python]
Publicado por: criskapunk 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 ;)



Título: Re: Valores incorrectos
Publicado por: Novlucker 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



Título: Re: Valores incorrectos
Publicado por: criskapunk 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 ;)


Título: Re: Valores incorrectos
Publicado por: [L]ord [R]NA 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


Título: Re: Valores incorrectos [python]
Publicado por: Meta 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


Título: Re: Valores incorrectos [python]
Publicado por: [L]ord [R]NA 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


Título: Re: Valores incorrectos [python]
Publicado por: Karcrack 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)