Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 兑换计算器仅在需要一种硬币时工作_Python_Python 2.7 - Fatal编程技术网

Python 兑换计算器仅在需要一种硬币时工作

Python 兑换计算器仅在需要一种硬币时工作,python,python-2.7,Python,Python 2.7,我目前正在尝试学习python,并且一直在进行/r/learnpython上的初学者项目。我对ChangeCalculator项目的想法是创建一个字典,其中包含“quarter”、“dime”、“nickel”和“penny”键,每个键的值都初始化为0。如下所示,我的代码似乎仅在我输入的更改只需要一种硬币类型时才起作用,即0.75-->三个四分之一硬币、0.1-->一个一角硬币等 change_map = { 'quarter' : 0, 'dime' : 0, 'ni

我目前正在尝试学习python,并且一直在进行/r/learnpython上的初学者项目。我对ChangeCalculator项目的想法是创建一个字典,其中包含“quarter”、“dime”、“nickel”和“penny”键,每个键的值都初始化为0。如下所示,我的代码似乎仅在我输入的更改只需要一种硬币类型时才起作用,即0.75-->三个四分之一硬币、0.1-->一个一角硬币等

 change_map = {
    'quarter' : 0,
    'dime' : 0,
    'nickel' : 0,
    'penny' : 0
}

def calculator(change):
    while change > 0:
        if change >= 0.25:
            change -= 0.25
            change_map['quarter'] += 1
        elif change < 0.25 and change >= 0.10:
            change -= 0.10
            change_map['dime'] += 1
        elif change < 0.10 and change >= 0.05:
            change -= 0.05
            change_map['nickel'] += 1
        elif change < 0.05 and change >= 0.01:
            change -= 0.01
            change_map['penny'] += 1
    print "You need the following: "
    print change_map

change = raw_input("Please enter amount of change: ")
change = float(change)
calculator(change)
change\u map={
“四分之一”:0,
“一角”:0,
“镍”:0,
“penny”:0
}
def计算器(更改):
当更改>0时:
如果更改>=0.25:
变化-=0.25
更改_映射['quarter']+=1
elif变化<0.25且变化>=0.10:
变化-=0.10
更改映射['dime']+=1
elif变化<0.10且变化>=0.05:
变化-=0.05
更改地图['nickel']+=1
elif变化<0.05且变化>=0.01:
变化-=0.01
改变地图['penny']+=1
打印“您需要以下内容:”
打印更改地图
变更=原始输入(“请输入变更金额:”)
更改=浮动(更改)
计算器(更改)

我调试了你的代码,发现有一个无限循环。可能是因为浮点运算。您可以声明一个epsilon值,如

eps = 1e-2
和分别更改while循环

while change > eps
浮点算术错误 您的错误是由于。下面是当您输入一个值(如
0.26
)时发生的情况

change = 0.26
change  -= 0.25
change  -= 0.01
print (change) # 8.673617379884035e-18
由于
change
的最后一个值高于
0
但低于
0.01
,因此进入了一个无限循环

如何修复它 解决这个问题的一种方法是依靠精确的算法,使用
int
而不是
float
来表示离散值,如货币。这意味着你的基本单位是美分而不是美元

change_map = {
    'quarter' : 0,
    'dime' : 0,
    'nickel' : 0,
    'penny' : 0
}

def calculator(change):
    while change > 0:
        if change >= 25:
            change -= 25
            change_map['quarter'] += 1
        elif change >= 10:
            change -= 10
            change_map['dime'] += 1
        elif change >= 5:
            change -= 5
            change_map['nickel'] += 1
        else:
            change -= 1
            change_map['penny'] += 1

    print ("You need the following: ")
    print (change_map)

change = raw_input("Please enter amount of change: ")

# Here we convert the decimal value input by the user to cents
change = int(float(change) * 100)

calculator(change)
例如:

Please enter amount of change: 0.26
You need the following: 
{'quarter': 1, 'dime': 0, 'nickel': 0, 'penny': 1}
改进 另一方面,您可以通过使用硬币的值和名称的
dict
来改进您的解决方案。特别是,这允许您通过更新
dict
来扩展程序,而不必添加新的if语句

下面是一个例子,它增加了将一美元作为零钱返还的可能性

value_map = {
    100: 'dollar',
    25: 'quarter',
    10: 'dime',
    5: 'nickel',
    1: 'penny'
}

def calculator(change):
    change_map = {}

    for value in sorted(value_map, reverse=True):
        coin = value_map[value]
        change_map[coin], change = divmod(change, value)

    print ("You need the following: ")
    print (change_map)

change = raw_input("Please enter amount of change: ")

change = int(float(change) * 100)

calculator(change)

此外,由于float将值存储为“0.0000000000 2”,并且您的程序没有else语句,因此您正在运行一个无限循环。在代码中添加else:break允许您运行0.76和其他值谢谢您的帮助!这是非常有见地的,这仍然有可能打破非常长的操作链。如果允许任意多个操作,则可以任意增大浮动误差。@OlivierMelançon这没有意义,因为他没有适当的“硬币”来增加误差much@Kirial科罗廖夫是我的意思的一个例子<代码>x=1000.01;当x>0:x-=0.25时,最终输出为
-0.2400000000000091
。现在把x放大<代码>x=10000.01;当x>0:x-=0.25时,最终输出现在是
-0.2399999978172
。因此,通过增大初始值,误差会增大。特别是,通过选择一个足够大的x,我可以使错误超过你在答案中给出的界限。