python - 为什么如果块不通过?
问题描述
我正在做一个编码挑战,遇到了这个我以前从未遇到过的问题。问题要求以最有效的方式归还零钱。用户输入价格,支付的金额作为数组(有点像给自动售货机钱)
出于某种原因,当剩余更改为 0.01 时,代码不会通过最后一个 if 块
def ChangeMaker(price, payment):
# Write your code here
totalPayment=0
for i in payment:
totalPayment+=i
change = totalPayment-price
coinChange=change-int(change)
def helper(remain, result):
holder= result
newRemain = remain
if remain>=.25:
holder[3]+=1
newRemain-=.25
return helper(newRemain, holder)
elif remain>=.10:
holder[2]+=1
newRemain -=.10
return helper(newRemain, holder)
elif remain>=.5:
holder[1]+=1
newRemain -=.05
return helper(newRemain, holder)
elif remain>.01 or remain==.01:
holder[0]+=1
newRemain -=.01
return helper(newRemain, holder)
else:
return holder;
return helper(coinChange, [0,0,0,0])
print(ChangeMaker(1.87, [5, .25,.25,.25,.25, 1]))
解决方案
正如@gmds 所说,这纯粹是一个浮点精度问题。这是计算钱的快速解决方案(只有 2 个小数位),将每个数字按 100 计时,然后将它们转换为整数。
def ChangeMaker(price, payment):
# Write your code here
totalPayment=int(sum(payment) * 100)
price = int(price * 100)
change = totalPayment-price
coinChange=change % 100
def helper(remain, result):
holder= result
newRemain = remain
if remain>=25:
holder[3]+=1
newRemain-=25
return helper(newRemain, holder)
elif remain>=10:
holder[2]+=1
newRemain -= 10
return helper(newRemain, holder)
elif remain>=5:
holder[1]+=1
newRemain -= 5
return helper(newRemain, holder)
elif remain >= 1:
holder[0]+=1
newRemain -= 1
return helper(newRemain, holder)
else:
return holder
return helper(coinChange, [0,0,0,0])
print(ChangeMaker(1.87, [5, .25,.25,.25,.25, 1]))
推荐阅读
- asp.net-core - 在 RedirectToAction 之后运行后台任务
- javascript - 如何更新嵌套在 ReactJS 中的对象内的数组的属性
- google-app-engine - 有没有办法检测 AppEngine 中的版本是否为非默认版本?
- python - 使用 itertools 重复数字
- python - matplotlib 将循环中的值绘制为同一图上的单独行,根据循环变量分配图例
- google-apps-script - 脚本始终处于活动状态
- python - 使用 GET Flask restful MongoEngine Clean Code 管理多个参数
- c# - 在 ASP.Net Core Web Api 中模拟用户
- npm - BotFramework 调度模型:自动化调度命令行工具
- javascript - 如何发送和接收数据wifi热点板以响应本机应用程序?