我用 Python 编写了一个简单的零钱计算器用于练习,但遇到了问题。这是我的代码:
amounts = (100, 50, 20, 10, 5, 2, 1, 0.25, 0.10, 0.05, 0.01)
def get_change(full_amount):
final_change = []
for amount in amounts:
number = 0
while full_amount >= amount:
if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break
number += 1
full_amount -= amount
final_change.append(number)
return final_change
假设我输入 2.40。它从 2.40 变为 0.40(一个卡通),然后应该变为 if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break
它会跳过 0.25,并以 4 角硬币结束。然而,实际上,它最终只有 3 个一角硬币、一个五分硬币和四个便士。当剩余量等于所测试的量时(剩余 0.10 美分,实际量为 0.10 美分 - 与镍相同),问题似乎出现了
最佳答案
这里的答案是,您不应该将不可分割的值表示为 float 。以美分表示一切。
解决方案的原因是 float 无法精确表示所有小数。因此,除以不同的金额不会达到您想要的效果。相反,您需要除以整数,并适当处理出现的任何余数。
一般来说,由于这个原因,对 float 的相等性检查也是危险的:您需要决定什么差异是“足够相等”并进行测试。
关于python - Python 中的十进制数相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878886/