Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x - Fatal编程技术网

python找到最小数量的硬币

python找到最小数量的硬币,python,python-3.x,Python,Python 3.x,我的任务是制定一个程序,将采取货币数额,并找到最低数量的硬币需要得到该数额。这是我的密码 import math n1 = eval(input("Enter a monetary amount: ")) n1 = n1 * 100 dollars = 0 quarters = 0 dimes = 0 nickels = 0 pennies = 0 dollars = n1 / 100 n1 %= 100 quarters = n1 / 25 n1 %= 25 dimes = n1

我的任务是制定一个程序,将采取货币数额,并找到最低数量的硬币需要得到该数额。这是我的密码

import math

n1 = eval(input("Enter a monetary amount: "))

n1 = n1 * 100

dollars = 0
quarters = 0
dimes = 0
nickels = 0
pennies = 0

dollars = n1 / 100
n1 %= 100

quarters = n1 / 25 
n1 %= 25

dimes = n1 / 10 
n1 %= 10

nickels = n1 / 5 
n1 %= 5

pennies = n1


print (int(dollars), int(quarters), int(dimes), int(nickels), int(pennies))
每当我输入一个需要五分镍币的数字时,它都不计算它们。例如,1.05的输出为

1 0 0 0 0
1.15的输出为

1 0 1 0 4
如有任何提示,将不胜感激,谢谢


编辑了我的一个输入错误,但代码仍然没有按预期工作。

看起来像是一个输入错误:
nickels
vs
nickels

编辑:既然你已经修正了打字错误,看起来这肯定是一个取整问题。由于您正在将美元转换为整数美分,因此在执行任何操作之前,请尝试将其转换为整数


将您的
n1=n1*100
行更改为
n1=int(圆形(n1*100))
。我在我的电脑上试了一下,它似乎起了作用。

看起来像是打字错误:
nickles
vs
nickles

编辑:既然你已经修正了打字错误,看起来这肯定是一个取整问题。由于您正在将美元转换为整数美分,因此在执行任何操作之前,请尝试将其转换为整数


将您的
n1=n1*100
行更改为
n1=int(圆形(n1*100))
。我在我的电脑上试用了这个方法,似乎效果不错。

您遇到了浮点问题:

>>>> 1.15*100
114.99999999999999
正如你所看到的,这里你显然没有115美分。你就在那下面。所以你用一美元、一角硬币和4.99999便士(
int
四舍五入)


解决此问题的最简单方法是让用户给您一个整数美分,这样您就可以在整个时间内以美分为单位工作,或者使用内置的
round
函数来消除浮点错误。

您遇到了浮点问题:

>>>> 1.15*100
114.99999999999999
正如你所看到的,这里你显然没有115美分。你就在那下面。所以你用一美元、一角硬币和4.99999便士(
int
四舍五入)


解决这个问题最简单的方法是让用户给你一个整数美分,这样你就可以一直用美分工作,或者使用内置的
round
函数来消除浮点错误。

对于这类问题,最好一直使用美分。试着用105美分(整数)代替1.05乘以100。你可以避免把所有的东西凑在一起。此外,由于您关心“余数”,请使用模运算符而不是除法

我会这样解决:

cents = 115
remainder = cents%25
nickels = (cents - remainder)/25

cents = remainder
remainder = cents%10
dimes = (cents - remainder)/10

...
等等


然而,可能不是你问的问题,但在一般情况下,这个问题是NP难的,而且根据硬币面额的不同,一些变化是不可能的。

对于这类问题,最好一直使用美分。试着用105美分(整数)代替1.05乘以100。你可以避免把所有的东西凑在一起。此外,由于您关心“余数”,请使用模运算符而不是除法

我会这样解决:

cents = 115
remainder = cents%25
nickels = (cents - remainder)/25

cents = remainder
remainder = cents%10
dimes = (cents - remainder)/10

...
等等

然而,可能不是你问的问题,但在一般情况下,这个问题是NP难的,并且进一步取决于硬币面额,一些变化是不可能的。

你可以参考更全面的解释,但基本上是在你的代码中键入
1.05
(或通过
eval
)它不存储您可能期望的确切值:

>>> (1.05).as_integer_ratio()
(4728779608739021, 4503599627370496)
如果希望计算机存储数字的精确十进制表示形式,只需在中间步骤中使用:

n1 = decimal.Decimal(input("Enter a monetary amount: "))

n1 = int(n1 * 100) #now you won't get rounding issues
或者,您可以分析自己输入的数字以删除小数点,并跳过所有补偿所需的数学运算:

def dollar_to_cent(s):
    n,_,end = s.partition(".")
    if not all(i=="0" for i in end[2:]):
        raise ValueError("can only have up to two digits after decimal.")
    return int("{}{:0<2}".format(n,end[:2]))

>>> dollar_to_cent("1")
100
>>> dollar_to_cent("2.")
200
>>> dollar_to_cent("2.3")
230
>>> dollar_to_cent("2.05")
205
>>> dollar_to_cent("2.050000")
205
>>> dollar_to_cent("2.001")
Traceback (most recent call last):
   ...
ValueError: can only have up to two digits after decimal.
def美元对美分:
n、 _u,end=s.分区(“.”)
如果不是全部(对于结尾[2:]中的i,i==“0”):
raise VALUE ERROR(“小数点后最多只能有两位数字”)
return int(“{}{:0您可以参考以获得关于发生了什么的更全面的解释,但基本上当您在代码中键入
1.05
(或通过
eval
)时,它不会存储您可能期望的准确值:

>>> (1.05).as_integer_ratio()
(4728779608739021, 4503599627370496)
如果希望计算机存储数字的精确十进制表示形式,只需在中间步骤中使用:

n1 = decimal.Decimal(input("Enter a monetary amount: "))

n1 = int(n1 * 100) #now you won't get rounding issues
或者,您可以分析自己输入的数字以删除小数点,并跳过所有补偿所需的数学运算:

def dollar_to_cent(s):
    n,_,end = s.partition(".")
    if not all(i=="0" for i in end[2:]):
        raise ValueError("can only have up to two digits after decimal.")
    return int("{}{:0<2}".format(n,end[:2]))

>>> dollar_to_cent("1")
100
>>> dollar_to_cent("2.")
200
>>> dollar_to_cent("2.3")
230
>>> dollar_to_cent("2.05")
205
>>> dollar_to_cent("2.050000")
205
>>> dollar_to_cent("2.001")
Traceback (most recent call last):
   ...
ValueError: can only have up to two digits after decimal.
def美元对美分:
n、 _u,end=s.分区(“.”)
如果不是全部(对于结尾[2:]中的i,i==“0”):
raise VALUE ERROR(“小数点后最多只能有两位数字”)

返回int(“{}{:0为什么使用
eval
而不是
int
float
?@KevinMGranger我假设它通过
2to3
脚本,因为它将python2的
输入(…)
更改为
eval(输入(…)
我无法重现这种行为,您可以添加
print(repr(n1))
在每一步之间?我有一种感觉,浮点操作要对此负责。是的,浮点操作是罪魁祸首,我建议将
eval
切换为
decimal.decimal
,看看这是否解决了您的问题,或者让用户以美分输入数字,跳过
n1*100
步骤,或者using
round
为什么使用
eval
而不是
int
float
的可能重复?@KevinMGranger我假设它通过
2to3
脚本,因为它将python2的
输入(…)
更改为
eval(输入(…)
我无法重现那种行为,你能添加
print(repr(n1))
在每一步之间?我有一种感觉,浮点操作要对此负责。是的,浮点操作是罪魁祸首,我建议将
eval
切换为
decimal.decimal
,看看这是否解决了您的问题,或者让用户以美分输入数字,跳过
n1*100
步骤,或者using
round
感谢的可能副本,