而循环前进的太早和不一致

2024-10-01 02:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中,我想把一笔钱分成面额。我正在使用while循环来完成这个任务。然而,我的变量转换到较低的钞票/硬币太早了。你知道吗

我添加了一些print命令来隔离问题,我认为它来自第11行。你知道吗

nmoney = 1.2
print 'original: ' + str(1.2)
bills = []
denominations = [100., 20., 10., 5., 1., .25, .10, .05, .01]
n = 0
while 0<nmoney<=1000:
  hbill = denominations[n] #error
  while nmoney>=hbill: #possible stem of error?
    bills.append(hbill)
    nmoney-=hbill
    print '+' + str(hbill) + ' ' + str(bills) + ' ' + str(nmoney)
  n+=1
  print 'SWITCH from ' + str(hbill)
print 'DONE'

我希望列表输出如下所示: [1.0, 0.1, 0.1] 然而,名单最终是这样的: [1.0. 0.1, 0.5, 0.01, 0.01, 0.01, 0.01]

~编辑: 当我使用1.3作为nmoney var时,得到了一个奇怪的输出。我只更改了第1行,但由于某种原因,变量中添加了一个非常小的数字。以下是输出文本的摘录:

SWITCH from 0.1
+0.05 [1.0, 0.25, 0.05] 4.16333634234e-17
SWITCH from 0.5

中间行最右边的数字是nmomey。你知道吗


Tags: 代码from硬币数字errorprintswitchwhile
2条回答

正如Sıddık Açıl所指出的,这是由于浮点运算的准确性。介于0.1和0.2之间的浮点数的数量是无限的。你的电脑必须在某处划清界限。你知道吗

这个修正解决了你的问题,只记得最后再把账单除以100。你知道吗

nmoney = 1.2
nmoney = nmoney * 100
print('original: ' + str(1.2))
bills = []
denominations = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1]
n = 0
while 0 < nmoney <= 1000:
    hbill = denominations[n]  # error
    while nmoney >= hbill:  # possible stem of error?
        bills.append(hbill)
        nmoney -= hbill
        print('+' + str(hbill) + ' ' + str(bills) + ' ' + str(nmoney))
    n += 1
    print('SWITCH from ' + str(hbill))
print('DONE')

欢迎使用堆栈溢出。你的问题是,浮点运算在计算中不是“那么”精确。你知道吗

1.2-1不是0.2。它是0.1999999999996。你知道吗

0.1999999999996-0.1是0.09999999999995(不清楚是0.1)

所以你的循环继续下去。你知道吗

相关问题 更多 >