python - 如何保持 Python 函数的精度?
问题描述
全部,
我正在研究一个简单的函数,它接受一个值并根据该值计算要分配的最小硬币数量。我一直使用 1.20 作为我的金额。因此,我应该拿回 6 个硬币 - 2 个硬币和 2 个硬币。为简单起见,我只显示代码的四分之一部分。当我在下面运行我的示例代码时,操作量 = 量 - 季度的精度在前两次迭代中是正确的,但是,到第三次,量变为 0.44999999999999996。
- 第一次迭代:0.95
- 第二次迭代:0.7
- 第三次迭代:0.44999999999999996
你知道为什么会发生这种情况以及我如何解决这个问题吗?我试过使用 decimal.Decimal 并改变精度。我不想只修复格式,而是想修复实际金额,因为这对于计算多少硬币至关重要。
#amount for testing
amount = 1.20
#coins
quarter = 0.25
def min_coins(amount):
count_quarter = 0
while amount >= quarter:
amount = amount - quarter
print(amount)
count_quarter += 1
min_coins(amount)
解决方案
正如John Gordon 所指出的,对于货币应用程序,您根本不想使用浮点数。要么使用该decimal.Decimal
模块进行精确的小数计算,要么使用int
便士而不是float
美元来进行数学运算;如果 API 必须接受float
美元,则在输入时转换值,并在返回时转换回来。对于您的代码,int
便士方法如下所示:
#amount for testing
amount = 1.20
#coins
quarter = 25
def min_coins(amount):
amount = round(amount * 100) # Convert from float dollars to int pennies
count_quarter = 0
while amount >= quarter:
amount -= quarter
print(amount) # Or print('{:.2f}'.format(amount / 100)) if necessary
count_quarter += 1
min_coins(amount)
推荐阅读
- c# - C#:等待元素包含 Selenium 中的特定属性
- vba - 使用 Microsoft Access Form 的 New 运算符创建多个非默认实例
- sql - Unnest 2 个级别 - Big Query 数组
- reactjs - setter setDate 不更新日期变量的状态
- css - 使用 v-menu 和样式不起作用
- keycloak - 到 Azure 事件网格的 KeyCloak 事件
- windows-10 - 在 Windows 10 上更新 GDB 版本
- c# - ',十六进制值 0x0B,是无效字符。线 78839,位置 103。
- excel - 计算没有循环错误的处理结束日期
- node.js - 在 Heroku 上部署 docker-compose