Python使用>=
我现在正在学习Python(2.7),一个练习说写一个程序,计算你需要多少硬币才能支付一笔特定的金额。 我的解决办法是: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)
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: