在Python中用分币向上取整?
我正在用Python写一个找零程序。用户需要输入一个美元金额,然后程序会计算出需要找回的零钱,包括20美元、10美元、5美元、1美元、25美分、10美分、5美分和1美分。我被要求在计算1美分时使用四舍五入的函数,因为如果我输入58.79美元,程序会告诉我应该找回3个1美分,但实际上应该是4个。有没有办法把这些1美分向上取整呢?
我知道1美分的值是0.01,但Python把这个值读成了0.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 个回答
问题在于,0.01
这个数字在计算机里不能准确地用二进制浮点数表示(这就是普通的 float
是怎么存储的——这在任何编程语言中都是如此,不仅仅是 Python)。所以如果你需要精确的美元和分的数值,可以使用decimal 模块。这样你就可以确保你的数值会被准确地四舍五入。
或者(因为使用 Decimal 可能有点复杂),你可以先把每个美元的数值乘以 100 (这和上面提到的除以 0.01 是不一样的!),然后把它转换成 int
类型,进行计算后再除以 100。
把用户输入的美元金额乘以100,然后转换成整数,这样就可以用分来计算了。
整数运算非常简单(而且结果准确)。而浮点数运算就比较复杂,需要动脑筋 :)。为了省心省力,最好全部用整数来计算。
你遇到的问题是因为浮点数计算不够精确。用IEEE浮点数格式无法准确表示0.01。这也是为什么在处理货币时不建议使用浮点数的原因之一。
你应该使用小数或者整数,因为你知道小数点后最多只有两位数字。在这种情况下,可以直接用美分来计算金额。
关于这个问题,我觉得最简单的方法是把你的美元金额转换成美分,然后遍历一个预定义的列表,这个列表包含了每种面额对应的美分数(从大到小排列):
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 上所示