首页 > 解决方案 > 如何修复函数中的舍入错误

问题描述

所以我们的目标是将钱转换成你可以拥有的可能的硬币

到目前为止我的代码:

 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,是否有不同的方法来编写我的代码,因此不会发生舍入错误?

标签: python

解决方案


正如@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)

推荐阅读