Python用> =计数

Max*_*axi 8 python

我现在正在学习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)

我还将变量名称更改sumamount- 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数据类型.