我正在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 回答
您遇到的问题是浮点运算不精确的结果 . 在IEEE浮点中无法精确表示0.01 . 这是使用货币时不使用浮动的一个原因 .
您应该使用小数甚至整数,因为您知道小数点后最多有2位数 . 在这种情况下,只需要用便士的数量 .
关于问题本身,我认为最简单的方法是将美元金额转换为便士金额,然后迭代预定义的值列表,其中包含每个面额列出等量的便士(按降序排列):
现在调用
change(58.79)
将打印正如codepad.org所见
将用户输入的美元值乘以100,转换为int,并以便士为单位工作 .
整数算术很简单(而且准确) . 浮点运算很棘手,迫使你使用更多脑细胞:) . 保存脑细胞,完全以整数运作 .
问题是
0.01
无法准确表示为二进制浮点值(这是正常float
的存储方式 - 对于任何语言都是如此,而不仅仅是Python) . 因此,如果您需要精确的美元和美分值,您可以使用decimal module . 这样,您可以确保您的值将精确舍入 .或者(因为小数可能在这里有点过分),首先将每个美元值乘以100(由于上述原因,这与除以0.01不同!),转换为
int
,进行计算,除以100 .使用十进制包
http://docs.python.org/library/decimal.html
它完全是为了这种用例
[编辑]
现在我想到了它,也许只是顺其自然