Python使用>=

Python使用>=,python,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)

我现在正在学习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
这几乎是可行的,但当我输入例如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]

为什么??这与舍入有关吗?

对于货币计算,如果可以,最好避免使用
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]
我还将变量名从
sum
更改为
amount
-
sum
将隐藏内置函数

结果:

bite gebe einen Euro Betrag ein:17.79
[10.0, 5.0, 2.0, 0.5, 0.2, 0.05, 0.02, 0.02]
或者,您可以在不使用内部
while
循环的情况下实现此功能,如下所示:

for cent in cents:
    n = int(math.floor(amount / cent))
    amount -= n * cent
    coins += [cent] * n
可以提前退出循环(
如果不是amount:break
)并避免不必要的操作(
如果不是n:continue
),但为了可读性,我省略了这些保护


另一种可能的替代方法是使用数据类型。

@BartoszKP指出,最好避免使用
float
,因为你可能会得到一些你不喜欢的讨厌的小数。因此,您可能希望使用
round
,只需对代码进行少量更改,就可以执行以下操作:

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 -= round(i,2)
        coins.append(i)

if sum > 0:
    coins.append(round(sum,2))

print coins
[输出:]

Bitte gebe einen Euro Betrag ein: 19.99
[10, 5, 2, 2, 0.5, 0.2, 0.2, 0.05, 0.02, 0.01, 0.01]
但这并不是最佳解决方案,因为您可能需要这样做;)


是的。如果在执行代码后检查“总和”值,则会得到类似000999999999133的值,该值小于最小的硬币

我的建议?每件事都用分钱做

sum = int(input("Your text") * 100)
cents = [2000,1000,500,200,100,50,20,10,5,2,1]
coins = []

for i in euro:
    while True:
        if i <= sum:
            coins.append(i)
            sum -= i
        else:
            break

for i in range(len(coins)):
    coins[i] /= 100

print(coins)
sum=int(输入(“您的文本”)*100)
美分=[20001000500200100,50,20,10,5,2,1]
硬币=[]
以欧元计算的i:
尽管如此:

如果我确实,正如前面所指出的,这似乎是一个舍入问题,因为算法(对于这组硬币!)是正确的。如果将硬币存储为整数(单位:美分),则计算出正确的解决方案:

s = input("Bitte gebe einen Euro-Cent Betrag ein: ")
coins = []
euro = [2000,1000,500,200,100,50,20,10,5,2,1]

for i in euro:
    while s >= i:
        s -= i
        coins.append(i)
print coins
输出:

Bitte gebe einen Euro-Cent Betrag ein: 1779
[1000, 500, 200, 50, 20, 5, 2, 2]

顺便说一句,我建议不要使用
sum
作为变量名,因为它是内置函数的名称。

这是一个与
float
准确性相关的问题。经过计算,我得到:

sum == 0.009999999999999133
i、 e.略低于1欧元美分(注意,您不应该称之为
sum
,因为这样您就无法使用内置的
sum
功能,无法使用例如
sum(coins)
来获得总额)。您可以使用公差方法解决此问题,替换

while sum >= i:

类似地,最好使用公差来比较浮动,而不是:

if a == b:
使用

如果abs(a-b)<公差:

计数器从
0开始(
;)这是完整的代码吗?另外,不要使用
float
类型来存储数字。这可能导致舍入误差。最好是用美分存储钱。他/她的“解决方案”不正确。@Allendar:哪个柜台?另外@Maxi,您不应该使用
sum
作为变量名-它将隐藏内置项,因为他/她的作业是获得最佳解决方案;)。我给出了一个正确的解决方案,但不是最好的。
while (sum - i) > -0.001: # allow for slight inaccuracy
if a == b:
if abs(a - b) < tolerance: