我正在尝试创建一个函数,该函数返回某些变化的便士,镍币,角钱和四分之一硬币的数量(给定的成本和所给的金额)。
我编写了以下代码,但输出始终为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')
答案 0 :(得分:2)
这可以使用mod
(也称为余数运算符(%)和底数划分)来完成。
首先将所有内容转换为美分,以避免处理十进制数字。
例如,如果我需要给$ 1.41 => 141美分。
季度(25)
141 // 25 = 5(给出5个季度)
141%25 = 16(剩余16美分)
角钱(10)
16 // 10 = 4(给予4角钱)
16%10 = 6(剩余6美分)
其余的值等等。
答案 1 :(得分:1)
这是我的解决方案。它非常简短。这里与您的方式的区别是:
代码:
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}