Valores incorrectos [python]

Iniciado por criskapunk, 15 Octubre 2010, 22:29 PM

0 Miembros y 1 Visitante están viendo este tema.

criskapunk

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:

Código (python) [Seleccionar]
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 ;)


Novlucker

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

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

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 (python) [Seleccionar]
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 ;)

[L]ord [R]NA

Utiliza la funcion round(valor,ndigitos)

Código (python,11) [Seleccionar]
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

Meta

Código (python) [Seleccionar]

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
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

[L]ord [R]NA

Cita de: Meta en 16 Octubre 2010, 02:59 AM
Código (python) [Seleccionar]

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

Karcrack

Lo hice el año pasado para el instituto.
Código (python) [Seleccionar]
# 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)