首页 文章

在Python中用便士计算?

提问于
浏览
3

我正在python中进行更改程序 . 用户必须输入一个美元金额,然后程序将计算二十,十,五,一,四分之一,硬币,镍币和便士的变化 . 我被指示使用圆形功能来赚钱,因为如果我输入58.79美元的金额,程序会告诉我当它应该是4时给3便士 . 有没有办法把这些便士弄圆?

我知道一分钱的 Value 是.01,但是python将其读作.100000000001,我认为这是问题所在 .

任何帮助表示赞赏,这里是我需要舍入的部分:

# get the amount to change from the user

change = input("Please enter the amount to change: $")

print "To make change for $",change,"give the customer back:"

# calculate number of twenties
twenties = int(change/ 20)

print twenties, "twenties"

change = change - twenties *20

# calculate tens
tens = int(change / 10)

print tens, "tens"

change = change - tens *10

#calculate fives
fives = int(change / 5)

print fives, "fives"

change = change - fives *5

#calculate ones
ones = int(change / 1)

print ones, "ones"

change = change - ones * 1

#calculate quarters
quarters = int(change / .25)

print quarters, "quarters"

change = change - quarters * .25

#calculate dimes
dimes = int(change / .10)

print dimes, "dimes"

change = change - dimes * .10

#calculate nickels
nickels = int(change / .05)

print nickels, "nickels"

change = change - nickels * .05

#calculate pennies
pennies = int(change / .01)

print pennies, "pennies"

5 回答

  • 3

    您遇到的问题是浮点运算不精确的结果 . 在IEEE浮点中无法精确表示0.01 . 这是使用货币时不使用浮动的一个原因 .

    您应该使用小数甚至整数,因为您知道小数点后最多有2位数 . 在这种情况下,只需要用便士的数量 .


    关于问题本身,我认为最简单的方法是将美元金额转换为便士金额,然后迭代预定义的值列表,其中包含每个面额列出等量的便士(按降序排列):

    def change(amount):
    
        # this can be removed if you pass the amount in pennies
        # rather than dollars
        amount = int(round(amount*100))
    
        values = [2000, 1000, 500, 100, 25, 10, 5, 1]
        denom = ['twenties', 'tens', 'fives', 'ones', 'quarters', 'dimes', 'nickels', 'pennies']
    
        for i in range(len(values)):
            num = amount / values[i]
            amount -= num * values[i]
            print str(num) + " " + denom[i]
    

    现在调用 change(58.79) 将打印

    2 twenties
    1 tens
    1 fives
    3 ones
    3 quarters
    0 dimes
    0 nickels
    4 pennies
    

    正如codepad.org所见

  • 2

    将用户输入的美元值乘以100,转换为int,并以便士为单位工作 .

    整数算术很简单(而且准确) . 浮点运算很棘手,迫使你使用更多脑细胞:) . 保存脑细胞,完全以整数运作 .

  • 0

    问题是 0.01 无法准确表示为二进制浮点值(这是正常 float 的存储方式 - 对于任何语言都是如此,而不仅仅是Python) . 因此,如果您需要精确的美元和美分值,您可以使用decimal module . 这样,您可以确保您的值将精确舍入 .

    或者(因为小数可能在这里有点过分),首先将每个美元值乘以100(由于上述原因,这与除以0.01不同!),转换为 int ,进行计算,除以100 .

  • 1

    使用十进制包

    http://docs.python.org/library/decimal.html

    它完全是为了这种用例

  • 1
    >>> from math import ceil
    >>> a = 58.79
    >>> ceil(a % 0.05 * 100)
    4.0
    >>>
    

    [编辑]

    现在我想到了它,也许只是顺其自然

    >>> a = 58.79
    >>> a*100 % 5
    4.0
    

相关问题