Выяснить изменение денег в питоне - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть задание, в котором я должен попросить пользователя указать стоимость продукта и уплаченную сумму, я должен вывести изменение в копейках, центах, кварталах, 1, 5, 20, 50 и 100 долларов, например:стоимость товара составляет 19,99 долларов, а клиент оплачивает счет в размере 50 долларов.Предусмотренное изменение составляет 1 доллар 20 долларов, один 10 долларов США и один пенни.Я запутался, как получить такой вывод, хотя, любая помощь будет принята с благодарностью, вот что у меня есть до сих пор

cost = float(input('Cost: '))
amount_paid = float(input('Amount paid: '))
penny = 0.01
dime = 0.10
quarter = 0.25
dollar_1 = 1.00
dollar_5 = 5.00
dollar_10 = 10.00
dollar_20 = 20.00
dollar_50 = 50.00
dollar_100 = 100.00
change = cost - amount_paid
if amount_paid < cost:
    print('Error')

Я не знаю, что делать дальше

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

добро пожаловать в stackoverflow!Я написал код для вас, и вот как это работает.По сути, он видит каждую валюту и использует целочисленное деление //, чтобы увидеть, сколько целых чисел может поместиться. Затем вычитает эту сумму из оставшегося изменения, и процесс продолжается.Пожалуйста, спросите, не понимаете ли вы что-то или считаете, что произошла ошибка.Код:

cost = float(input('Cost: '))
amount_paid = float(input('Amount paid: '))
penny = 0.01
dime = 0.10
quarter = 0.25
dollar_1 = 1.00
dollar_5 = 5.00
dollar_10 = 10.00
dollar_20 = 20.00
dollar_50 = 50.00
dollar_100 = 100.00
changeTypes = {dollar_100:0,dollar_50:0,dollar_20:0,dollar_10:0,dollar_5:0,dollar_1:0,quarter:0,dime:0,penny:0}
change = amount_paid-cost
if amount_paid < cost:
    print('Error: InsufficientFunds')
for changeType in changeTypes:
    numAmount = max(0,change//changeType)
    change-=numAmount*changeType
    changeTypes[changeType] = int(numAmount)


print(changeTypes)

PS Вы должны сделать это функцией, это не должно быть слишком сложно.

0 голосов
/ 20 сентября 2018

Вы могли бы сделать это хорошо со словарями, но без использования по-прежнему есть много способов сделать это, варианты бесконечны, вот одна идея

def get_bills(change, value):
    if change//value > 0:
        bills = change//value
        change -= bills * value
        return bills, change
    else:
        return 0, change

cost = float(input('Cost: '))
paid = float(input('Amount Paid: '))
while paid < cost:
    paid = float(input('Amount Paid: '))

change = paid - cost

hundreds, change, = get_bills(change, 100)

fifties, change, = get_bills(change, 50)

twenties, change = get_bills(change, 20) 

tens, change = get_bills(change, 10) 

fives, change = get_bills(change, 5)

ones, change = get_bills(change, 1)

quarters, change = get_bills(change, .25)

dimes, change = get_bills(change, .1) 

nickels, change = get_bills(change, .05)

pennies = round(change * 100)

print(f"Hundreds: {hundreds}, Fifties: {fifties}, Twenties: {twenties}," +
      f" Tens: {tens}, Fives: {fives}, Ones: {ones}, Quarters: {quarters}," +  
      f" Dimes: {dimes}, Nickels: {nickels}, Pennies: " +
      f"{pennies}")
0 голосов
/ 19 сентября 2018

Обычная ошибка здесь - использовать поплавки.Вместо этого вы должны конвертировать все в наименьшую целую единицу (цент) и использовать целочисленную математику.Математика с плавающей точкой ... нечеткая.

currencies = {"penny": 1,
              "nickel": 5,
              "dime": 10,
              "quarter": 25,
              "dollar": 1_00,
              "five": 5_00,
              "ten": 10_00,
              "twenty": 20_00,
              "fifty": 50_00,
              "hundred": 100_00}
# never seen that numeric notation before? It's safe to embed underscores
# in numerical literals! It's often used for large numbers in place of
# commas, but it makes sense here in place of a period.

Тогда вам нужно всего лишь определить словарь для результата и использовать divmod, чтобы найти, сколько деноминации может уместиться в оставшейся сумме..

change_due = {}

for denomination, amt in reversed(currencies.items()):
    if amt < amt_due:
        d, m = divmod(amt_due, amt)
        change_due[denomination] = d
        amt_due = m
...