【问题标题】:Equal decimal numbers in Python [duplicate]Python中相等的十进制数[重复]
【发布时间】:2013-09-23 14:32:06
【问题描述】:

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

【问题讨论】:

  • (full_amount &lt; 0.50 and full_amount &gt; 0.10 and amount == 0.25) - 为什么要进行前两项检查?就做amount == 0.25。如果前两个失败,最后一个检查也会失败 - 所以不要这样做
  • 1.4 - 1 == 0.3999999999999999

标签: python


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 2010-10-10
      • 2020-01-21
      • 2011-11-21
      • 2015-06-20
      • 2021-06-13
      • 2014-02-19
      • 2013-06-12
      相关资源
      最近更新 更多