任务描述
本关任务:编写一个能模拟超市收银的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.数值运算
2.格式化输出
数值运算
+、-、*、/、//、%分别可以用于做加、减、乘、除、整除和取模的运算。
格式化输出
str.format()和f-string都可以用于格式化输出的字符串。
编程要求
收银员分两行输入用户需支付的金额和用户实际支付的金额数,系统先输出找零金额再计算并给出找零方案,假设收银员有足够的各种面值的零钱且优先用尽量多的大面值货币做找零,请计算找零中各种面额的货币的数量。要求大于或等于1元的一律用纸币,小于1元的一律用硬币做找零。按要求输出找零中每种货币的数量,使售货员可以按提示完成找零工作,避免出错。
输出格式参考示例,本题中找零只使用以下面值:
纸币:50元,20元,10元,5元,2元,1元
硬币:5角,2角,1角,5分,2分,1分
测试说明
平台会对你编写的代码进行测试:
测试输入:
28.7
100
预期输出:
需支付的金额:28.70元
实际支付的金额:100.00元
找零金额为:71.30元
50元纸币数量为:1张
20元纸币数量为:1张
1元纸币数量为:1张
2角硬币数量为:1个
1角硬币数量为:1个
提示:
浮点数经常无法精确表示可能会带到结果的偏差,需要解决
代码:
定义纸币和硬币的面值,单位为分(100分=1元)
paper_money = [5000, 2000, 1000, 500, 200, 100]
coin_money = [50, 20, 10, 5, 2, 1]
# 输入需支付的金额和实际支付的金额
to_pay = float(input(""))
paid = float(input(""))
# 将金额转换为分,避免浮点数精度问题
to_pay_cents = round(to_pay * 100)
paid_cents = round(paid * 100)
# 计算找零金额
change_cents = paid_cents - to_pay_cents
# 输出支付和找零信息
print(f"需支付的金额:{to_pay:.2f}元")
print(f"实际支付的金额:{paid:.2f}元")
print(f"找零金额为:{change_cents / 100:.2f}元")
# 初始化找零方案
change_plan = {}
# 计算纸币找零方案
for bill in paper_money:
count = change_cents // bill
if count > 0:
change_plan[f"{bill // 100}元纸币"] = count
change_cents -= count * bill
# 计算硬币找零方案
for coin in coin_money:
count = change_cents // coin
if count > 0:
if coin >= 10:
change_plan[f"{coin // 10}角硬币"] = count
else:
change_plan[f"{coin}分硬币"] = count
change_cents -= count * coin
# 输出找零方案
for currency, count in change_plan.items():
if "纸币" in currency:
print(f"{currency}数量为:{count}张")
else:
print(f"{currency}数量为:{count}个")