【问题标题】:Python: change calculatorPython:找零计算器
【发布时间】:2016-06-01 13:03:31
【问题描述】:

我正在尝试用最少的硬币来计算所需的硬币数量、硬币数量和镍硬币数量。这是我的代码:

x = raw_input("Please enter an amount of change")
x = float(x)
q = .25
d = .1
n = .05
numberQ = x/q
numberQ = int(numberQ)
money2 = x - (numberQ * q)
numberD = money2/d
numberD = int(numberD)
money3 = money2 - (numberD * d)
numberN = money3/n
numberN = int(numberN)
print numberQ
print numberD
print numberN

输出关闭。例如,如果我输入1.95,它将返回 7 个季度,1 个角钱和 1 个镍币,而它应该是 7 个季度,2 个角钱和 0 个镍币。

【问题讨论】:

  • protip:编写一个函数,找出可以从 $total 中取出多少 $coins 并返回 $remainder
  • 哪个版本的 Python?使用 / 时很重要。
  • 除法后,您可能希望将所有整数向下舍入。
  • 学习python目前不允许使用函数
  • 不可能用您的计算机使用的二进制精确表示像 .10 或 .05 这样的分数。我的建议是将输入乘以 100 以获得便士的数量并使用整数进行所有计算。

标签: python


【解决方案1】:

问题出在第二步。如果您从 1.95 开始,则第一步返回 7 个季度,剩余 0.20 美元。所以money2 现在是 0.20。现在我们除以一角钱的价值。由于浮点错误,我们的结果可能不是偶数 2,而是更像 1.9999999。 Python 2.7 的 int() 方法向零舍入,因此它被舍入为 1 角钱。余数是 0.10 美元,然后除以镍币的价值,这会导致同样的问题,但这次四舍五入到 1 镍币。

要解决此问题,我建议使用整数的便士而不是代表美元的浮点值。

因此,1.95 变为 195,1 美分硬币、1 美分硬币和 5 美分的值分别为 25、10 和 5。

编辑试试这个:

x = raw_input("Please enter an amount of change (in pennies)")
x = int(x)
q = 25
d = 10
n = 5
numberQ = (x - (x % q))/q
money2 = x % q
numberD = (money2 - (money2 % d))/d
money3 = money2 % d
numberN = (money3 - (money3 % n))/n
pennies = money3 % n
print numberQ
print numberD
print numberN
print pennies

% 给出整数除法的余数。如果我们从我们开始的金额中减去余数,然后除以硬币值,我们知道结果将是一个整数。剩余的成为新的金额。

【讨论】:

    【解决方案2】:

    这是由于浮动没有精确地保存值。

    >>> money2/d
    1.9999999999999996
    

    尝试将所有内容乘以 100:

    x = float(195)
    q = float(25)
    d = float(10)
    n = float(5)
    numberQ = x/q
    numberQ = int(numberQ)
    money2 = x - (numberQ * q)
    numberD = money2/d
    numberD = int(numberD)
    money3 = money2 - (numberD * d)
    numberN = money3/n
    numberN = int(numberN)
    print numberQ
    print numberD
    print numberN
    

    Online Example

    编辑:您也可以使用十进制包来执行此操作:

    from decimal import Decimal
    x = Decimal('1.95')
    q = Decimal('.25')
    d = Decimal('.10')
    n = Decimal('.05')
    numberQ = x/q
    numberQ = int(numberQ)
    money2 = x - (numberQ * q)
    numberD = money2/d
    numberD = int(numberD)
    money3 = money2 - (numberD * d)
    numberN = money3/n
    numberN = int(numberN)
    print numberQ
    print numberD
    print numberN
    

    【讨论】:

      【解决方案3】:

      您似乎遇到了浮点精度错误;例如,在 IDLE 中运行代码后,请求 money2money3 会给出这些值:

      >>> money2
      0.19999999999999996
      >>> money3
      0.09999999999999995
      

      如果您想了解更多信息,Computerphile 在here 上有一个很好的视频。除此之外,尝试将其转换为以整数美分表示货币;即 1.95 美元将是 195。

      祝你好运。

      【讨论】:

        【解决方案4】:

        问题是您的浮点值有时会接近实际值:在您的示例中,money2 的值假设为 0.2,但该值可能为 0.1999999... 所以当您转换为时 0.1999999/0.10 = 1.9999999999 int 它会像你想要的那样截断并变成 1 而不是 2:

        你可以尝试乘以 100

        x = x * 100
        q = 25
        d = 10
        n = 5
        

        Online Example

        【讨论】:

          【解决方案5】:

          我刚刚遇到了类似的问题,这似乎有效,它可能比它需要的要长得多:

          编辑:为此,您输入一个整数 - $78.65 输入为 7865。

          total = int(input())
          
          if total == 0:
              print('no change')
          if total//100 >= 1:
              if total//100 == 1:
                  print(total//100, 'dollar')
                  total = total % 100
              elif total//100 > 1:
                  print(total//100, 'dollars')
                  total = total % 100
          if total//25 >= 1:
              if total//25 == 1:
                  print(total//25, 'quarter')
                  total = total % 25
              elif total//25 > 1:
                  print(total//25, 'quarters')
                  total = total % 25
          if total//10 >= 1:
              if total//10 == 1:
                  print(total//10, 'dime')
                  total = total % 10
              elif total//10 > 1:
                  print(total//10, 'dimes')
                  total = total % 10
          if total//5 >= 1:
              if total//5 == 1:
                  print(total//5, 'nickel')
                  total = total % 5
              elif total//5 > 1:
                  print(total//5, 'nickels')
                  total = total % 5
          if total//1 >= 1:
              if total//1 == 1:
                  print(total//1, 'penny')
              elif total//1 > 1:
                  print(total//1, 'pennies')
          else:
              total
          

          【讨论】:

            猜你喜欢
            • 2018-08-07
            • 1970-01-01
            • 2016-11-02
            • 2020-02-08
            • 2023-02-09
            • 2016-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多