1

我用 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(一个 tonie),然后它应该去,这样做if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break会跳过 0.25 并以四角钱结束。然而,实际上,它最终得到了 3 个硬币、1 个镍币和只有 4 个便士。当剩余数量等于被测试的数量时,问题似乎出现了(剩余 0.10 美分,数量为 0.10 美分 - 与镍相同)

4

2 回答 2

2

这里的答案是你不应该将不可分割的值表示为浮点数。以美分表示一切。

解决方案的原因是浮点数不能精确地表示所有小数。因此,除以不同的数量不会做你想要的。相反,您需要除以整数,并适当处理出现的任何余数。

通常,由于这个原因,对浮点数的相等检查也很危险:您需要确定什么差异“足够相等”并进行测试。

于 2013-09-18T17:48:10.653 回答
1

将所有内容乘以 100 以消除小数。所以一角钱应该是 10 美分,一美元应该是 100 美分等等。由于浮点数不是数字的完美表示,因此您不应该对它们进行任何相等的检查或双打。

于 2013-09-18T17:53:25.580 回答