我在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(一个toonie),然后它应该去,if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break
它将跳过0.25并以四角钱结束。然而,实际上,它最终只有3角钱,一个镍,只有四个便士。当剩余金额等于被测量的金额时(剩余金额为0.10美分,金额为0.10美分 - 与镍金额相同),似乎会出现问题
答案 0 :(得分:2)
这里的答案是你不应该将不可分割的值表示为浮点数。以美分代表一切。
解决方案的原因是浮点数不能精确地表示所有小数。因此,按不同金额划分不会做你想要的。相反,您需要划分积分金额,并适当地处理任何发生的余数。
一般来说,对浮点数进行等式检查也是危险的:你需要确定哪些差异“足够相等”并对其进行测试。
答案 1 :(得分:1)
将所有内容乘以100以除去小数。所以一毛钱应该是10美分,1美元100美分等等。由于浮点数不是数字的完美表示,因此你不应对它们进行任何相同的检查或双重检查。