python - Python 中的十进制数相等

标签 python

我用 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/

相关文章:

python - 将 C 数组转换为 Python 字节

python - 安排自动化 shell 脚本不以 ROOT 身​​份运行

python - Pytorch:了解 nn.Module 类如何在内部工作

Python 纯 RMSE 与 Sklearn

python - 使用 ijson 在 Python 中解析 GoogleMaps API Json

python - 如何使字典在类实异常(exception)部不可变但在 python 中的类实例内部可变

python 2 定时器不遵循顺序

python - 在 python 中读取 bz2 文件的第一行

python - 用多字符字母查找特定字母表中的所有单词

python - 当 html 表单允许文件上传时,Django 以 "generator raised StopIteration"停止