退货变化(便士,镍币,硬币和硬币)

时间:2020-07-27 20:51:05

标签: python

我正在尝试创建一个函数,该函数返回某些变化的便士,镍币,角钱和四分之一硬币的数量(给定的成本和所给的金额)。

我编写了以下代码,但输出始终为1美分。我应该改变什么?

penny = 0.01
nickel = 0.05
dime = 0.10
quarter = 0.25

def return_change(cost, amount):
    
    number_of_pennies = 0
    number_of_nickels = 0
    number_of_dimes = 0
    number_of_quarters = 0
    change = amount - cost
    
    while change > 0:
        
        if change > quarter:
            change -= quarter
            number_of_pennies += 1
          
        if dime < change < quarter:
            change -= dime
            number_of_nickels += 1

        if nickel < change < dime:
            change -= nickel
            number_of_dimes += 1

        if penny < change < nickel:
            change -= penny
            number_of_pennies += 1

                    
                
        break
        
print(f'Given that the change is {amount-cost}$, we will give it in:\n{number_of_pennies} Pennies\n{number_of_nickels} Nickels\n{number_of_dimes} Dimes\n{number_of_quarters} Quarters')

5 个答案:

答案 0 :(得分:2)

这可以使用mod(也称为余数运算符(%)和底数划分)来完成。

首先将所有内容转换为美分,以避免处理十进制数字。

例如,如果我需要给$ 1.41 => 141美分。

  1. 季度(25)

    141 // 25 = 5(给出5个季度)

    141%25 = 16(剩余16美分)

  2. 角钱(10)

    16 // 10 = 4(给予4角钱)

    16%10 = 6(剩余6美分)

其余的值等等。

答案 1 :(得分:1)

这是我的解决方案。它非常简短。这里与您的方式的区别是:

  • 我们提供了更多的货币价值(因此我们不会返回:384个季度)
  • 我们将遍历所有可能性,直到流程不再需要更改
  • 我们处理浮点数的不精确性
  • 我们将最后一条消息编成循环
  • 我们仅打印至少返回一次的货币

代码:

import math

cur_values = [10000, 5000, 2000, 1000, 500, 100, 25, 10, 5, 1] #amounts are in pennies
cur_names  = ['$100', '$50', '$20', '$10', '$5', '$1', '25¢', '10¢', '5¢', '1¢']

def return_change(cost, paid):
    exc = []
    chg = round((paid-cost)*100)
    cur = cur_values[::]

    while chg > 0:
        c = cur.pop(0)
        exc.append(math.floor(chg / c))
        chg -= int(exc[-1]*c)

    teller = f"Total Cost: ${format(cost, '.2f')}\nPaid: ${format(paid, '.2f')}\nYour change is:\n"
    for n, c in zip(exc, cur_names):
        if n > 0:
            teller = f'{teller}\t{n} {c}\n'

    return teller


print(return_change(3.85, 100.00))


# Total Cost: $3.85
# Paid: $100.00
# Your change is:
#         1 $50
#         2 $20
#         1 $5
#         1 $1
#         1 10¢
#         1 5¢

答案 2 :(得分:0)

我可以发现的四个错误:

number_of_pennies += 1应该在第一次运行时增加四分之一而不是几美分。

无需在while循环中中断

打印应该在功能中

此外,我可能会使用整数并以便士计数或使用十进制类,这样就不会出现奇怪的舍入问题。

这似乎有很多错误,但这是一个好的开始-继续使用Python!

答案 3 :(得分:0)

以下是对每个硬币使用while循环并最小化所需硬币数量的变化形式:

penny = 0.01
nickel = 0.05
dime = 0.10
quarter = 0.25

def return_change(cost, amount):
    number_of_pennies = 0
    number_of_nickels = 0
    number_of_dimes = 0
    number_of_quarters = 0
    change = amount - cost
    while change-quarter > -0.01:
        number_of_quarters += 1
        change -= quarter
    while change-dime > -0.01:
        number_of_dimes += 1
        change -= dime
    while change-nickel > -0.01:
        number_of_nickels += 1
        change -= nickel
    while change-penny > -0.01:
        number_of_pennies += 1
        change -= penny
    print(f'Given that the change is {round(amount-cost,2)}$, we will give it in:')
    print(f'{number_of_pennies} Pennies')
    print(f'{number_of_nickels} Nickels')
    print(f'{number_of_dimes} Dimes')
    print(f'{number_of_quarters} Quarters')

return_change(23.54, 34.69)

输出:

Given that the change is 11.15$, we will give it in:
0 Pennies
1 Nickels
1 Dimes
44 Quarters

理想情况下,您看到的> -0.01应该是>= 0,但在解析时,数字会稍微分开。

答案 4 :(得分:0)

我不会在函数内打印,但会返回一些数据结构。这使功能更加通用和可重用。我将使用函数返回的数据结构来解决显示结果的问题。

解决变更部分的一种可能性是使用@Chris Charley和字典中提到的divmod(必须为3.6

def change(amount, units={25: 'quarter', 10: 'dime', 5: 'nickel', 1: 'penny'}):
    quantities = dict()
    for value, name in units.items():
        quantities[name], amount = divmod(amount, value)
        if not amount:
            break

    return quantities

# change(141) -> {'quarter': 5, 'dime': 1, 'nickel': 1, 'penny': 1}
# change(100) -> {'quarter': 4}