python - 如何修复函数中的舍入错误
问题描述
所以我们的目标是将钱转换成你可以拥有的可能的硬币
到目前为止我的代码:
def make_change(amount):
q_f = (amount // .25)
d_f = (amount - (q_f * .25)) // .10
n_f = (amount - ((q_f * .25) + (d_f * .10 ))) // .05
p_f = (amount - ((q_f * .25) + (d_f * .10) + (n_f * .05))) //.01
q = int(q_f)
d = int(d_f)
n = int(n_f)
p = int(p_f)
change = "" + str(q) + " quarter(s), " + str(d) + " dime(s), " + str(n) + " nickel(s) and
" + str(p) + " penny(ies) "
return (change)
问题是,假设您输入 make_change(.19),由于舍入错误,便士是 3 而不是 4,是否有不同的方法来编写我的代码,因此不会发生舍入错误?
解决方案
正如@barny 提到的,尽量远离带有货币的浮动。您可以通过将金额乘以 100 并使用减法来处理硬币来做到这一点。
试试这个代码:
def make_change(amount):
amount = int(amount * 100) # pennies are integers
coins = [25, 10, 5, 1] # coin values * 100
chg = [0]*len(coins) # coin counts
for i,c in enumerate(coins): # each coin
while amount - c >= 0: # subtract coins from largest to smallest
amount -= c # deduct coin amount
chg[i] = chg[i] + 1 # add to coin count
change = str(chg[0]) + " quarter(s), " + str(chg[1]) + " dime(s), " + str(chg[2]) + " nickel(s) and " + str(chg[3]) + " penny(ies)"
return change
lst = [0.19, 1.37, 2.42, 2.31, 1.09]
for a in lst:
print(a, '=', make_change(a))
输出
0.19 = 0 quarter(s), 1 dime(s), 1 nickel(s) and 4 penny(ies)
1.37 = 5 quarter(s), 1 dime(s), 0 nickel(s) and 2 penny(ies)
2.42 = 9 quarter(s), 1 dime(s), 1 nickel(s) and 2 penny(ies)
2.31 = 9 quarter(s), 0 dime(s), 1 nickel(s) and 1 penny(ies)
1.09 = 4 quarter(s), 0 dime(s), 1 nickel(s) and 4 penny(ies)
推荐阅读
- javascript - AutoSizer 和 Chakra 不能一起工作
- swift - Catch' 块无法访问,但我包括尝试
- javascript - 如何删除数据库中的概念页面?
- macos - 使用 PyInstaller 生成的应用程序在为 MacOS 构建后找不到文件
- elementor - 如何在 elementor 中添加功能 ATCWhatsapp OnClick 按钮
- flutter - 如何使用颤振提供程序从 Firestore 获取数据?
- google-earth - Google 地球创建 MGRS 网格线
- php - 这个 laravel 代码的等效 laravel 8 代码是什么?
- javascript - 即使网页是可滚动的,有没有办法让带有 css 的 html 的页眉和页脚始终显示?(没有javascript)
- api - 2captcha如何解决验证码,令牌对用户仍然有效?