Python中的等号

Equal decimal numbers in Python

本问题已经有最佳答案,请猛点这里访问。

我用python编写了一个简单的变更计算器以供实践,我遇到了一个问题。以下是我的代码:

1
2
3
4
5
6
7
8
9
10
11
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(a toonie),然后它应该去,对if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break,它将跳过0.25,以4个10分结束。然而,在现实中,它最终得到3个10美分,1个5美分,只有4个便士。当剩余量等于测试量(剩余0.10分,与测试量0.10分,与镍相同)时,问题似乎出现了。


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

这就是解决方案的原因,因为浮点数不能精确地表示所有的小数。因此,按不同的数量进行划分并不能满足您的需要。相反,您需要分割整数,并适当地处理出现的任何余数。

一般来说,对浮点数的相等性检查也是危险的,因为这个原因:您需要决定什么差异"足够相等",并为此进行测试。


把所有的都乘以100,去掉小数。所以一角钱应该是十美分,一美元一百美分等等。因为浮点数不是数字的完美表示,所以不应该对它们或双精度数做任何相等的检查。