Buenas chicos,
Estaba resolviendo este ejercicio y me surgió un problema:
CitarDada una cantidad de dinero, indicar como repartir el vuelto de manera que se utilice la menor cantidad de monedas.
Acá mi código:
b = (100, 50, 20, 10, 5, 2, 1, .5, .25, .1, .05)
v = float(raw_input("Ingrese vuelto: "))
i = 0
j = 0
l = len(b)
while i != l:
while v - b[i] >= 0:
v -= b[i]
j += 1
if j != 0:
print j, " billetes/monedas de ", b[i]
print "El valor restante es: ", v # Esta unicamente para comprobar los resultados
j = 0
i += 1
La salida del script utlizando como valor 1807.35 es:
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 ;)
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
Si, debe ser por eso. No me había fijado cuanto devolvía la resta (Eso me pasa por suponer :P)
Lo resolví así:
b = (100, 50, 20, 10, 5, 2, 1, 0.5, 0.25, 0.1, 0.05)
v = float(raw_input("Ingrese vuelto: "))
i = 0
j = 0
l = len(b)
while i != l:
while v - b[i] >= 0:
# v -= b[i]
v = (v * 10 - b[i] * 10) / 10
j += 1
if j != 0:
print j, " billetes/monedas de ", b[i]
j = 0
i += 1
if v != 0:
print "Con %.2f centavos imposibles de devolver" % v
Muchas gracias Novlucker! Un saludo ;)
Utiliza la funcion round(valor,ndigitos)
b = (100, 50, 20, 10, 5, 2, 1, .5, .25, .1, .05)
v = float(raw_input("Ingrese vuelto: "))
i = 0
j = 0
l = len(b)
while i != l:
while v - b[i] >= 0:
v -= b[i]
v = round(v,2)
j += 1
if j != 0:
print j, " billetes/monedas de ", b[i]
print "El valor restante es: ", v # Esta unicamente para comprobar los resultados
j = 0
i += 1
Valores de salida:
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
bi = int(raw_input('Ingresa dinero: '))
for eu in [500, 200, 100, 50, 20, 10, 5, 2, 1]:
print '%d billetes de %d' % ((bi / eu), eu)
bil = bi % eu
Cita de: Meta en 16 Octubre 2010, 02:59 AM
bi = int(raw_input('Ingresa dinero: '))
for eu in [500, 200, 100, 50, 20, 10, 5, 2, 1]:
print '%d billetes de %d' % ((bi / eu), eu)
bil = bi % eu
te falto .5, .25, .1, .05, .01
Lo hice el año pasado para el instituto.
# coding: utf-8
# Obtiene el desglose en billetes y monedas de una cantidad de Euros
# Creamos y obtenemos las variables
iMoney = round(float(raw_input("Dame una cantidad de Euros con 2 decimales:")),2)
# Recorremos la cantidad de posibles billetes o monedas
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]:
if (iMoney // nCantidad != 0):
if nCantidad >= 5: sNombre = "billete(s)"
if nCantidad < 5: sNombre = "moneda(s)"
print "%d %s de %.2f Euros" % (iMoney // nCantidad, sNombre, nCantidad)
iMoney -= (iMoney // nCantidad * nCantidad)