我现在正在学习Python(2.7),并且练习说写一个计算你需要支付特定金额的硬币数量的程序.我的解决方案是:
sum = input("Bitte gebe einen Euro Betrag ein: ")
coins = []
euro = [20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01]
for i in euro:
while sum >= i:
sum -= i
coins.append(i)
print coins
Run Code Online (Sandbox Code Playgroud)
这几乎可以工作,但是当我输入例如17,79时,它给了我17,78的硬币.
Bitte gebe einen Euro Betrag ein: 17.79
[10, 5, 2, 0.5, 0.2, 0.05, 0.02, 0.01]
Run Code Online (Sandbox Code Playgroud)
为什么?这与圆形有关吗?
Bar*_*zKP 10
对于货币计算,float如果可以,最好避免使用类型,因为累积舍入误差.您可以采用与此类似的方式执行此操作:
amount= input("Bitte gib einen Euro Betrag ein: ")
coins = []
cents = [2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1]
amount = int(float(amount) * 100)
for cent in cents:
while amount >= cent:
amount -= cent
coins.append(cent)
print [coin / 100.0 for coin in coins]
Run Code Online (Sandbox Code Playgroud)
我还将变量名称更改sum为amount- sum将影响sum内置函数.
结果:
Bitte gebe einen Euro Betrag ein: 17.79
[10.0, 5.0, 2.0, 0.5, 0.2, 0.05, 0.02, 0.02]
Run Code Online (Sandbox Code Playgroud)
或者,你可以在没有内while循环的情况下实现它,如下所示:
for cent in cents:
n = int(math.floor(amount / cent))
amount -= n * cent
coins += [cent] * n
Run Code Online (Sandbox Code Playgroud)
可以先退出循环(if not amount: break)并避免不必要的操作(if not n: continue),但为了便于阅读,我省略了这些防护.
另一种可能的替代方法是使用decimal数据类型.