我正在尝试计算所需的季度,硬币和镍币的数量,以便用尽可能少的硬币加总量。这是我的代码:
x = raw_input("Please enter an amount of change")
x = float(x)
q = .25
d = .1
n = .05
numberQ = x/q
numberQ = int(numberQ)
money2 = x - (numberQ * q)
numberD = money2/d
numberD = int(numberD)
money3 = money2 - (numberD * d)
numberN = money3/n
numberN = int(numberN)
print numberQ
print numberD
print numberN
输出已关闭。例如,如果我输入1.95
,它将返回7个季度,1个角钱和1个镍,当它应该是7个季度2个角钱和0个镍币。
答案 0 :(得分:3)
问题出在第二步。如果从1.95开始,第一步将返回7个季度,剩余的0.20美元。所以money2
现在是0.20。现在我们除以一角钱的价值。由于浮点错误,我们的结果可能不是偶数2但更像是1.9999999。 Python 2.7的int()
方法向零舍入,因此将其舍入为1角钱。剩余部分是0.10美元,这被除以导致同样问题的镍的值,但这次它向下舍入到一个镍。
要解决此问题,我建议使用整数个便士而不是代表美元的浮点值。
因此,1.95变为195,四分之一,一角钱和一个镍的值分别为25,10和5。
修改试试这个:
x = raw_input("Please enter an amount of change (in pennies)")
x = int(x)
q = 25
d = 10
n = 5
numberQ = (x - (x % q))/q
money2 = x % q
numberD = (money2 - (money2 % d))/d
money3 = money2 % d
numberN = (money3 - (money3 % n))/n
pennies = money3 % n
print numberQ
print numberD
print numberN
print pennies
%
给出整数除法的余数。如果我们从我们开始的金额中减去余数并将其除以硬币值,我们知道结果将是一个整数。剩余部分成为新的资金。
答案 1 :(得分:2)
这是因为浮动并没有精确地保持这些值。
>>> money2/d
1.9999999999999996
尝试将所有内容乘以100:
x = float(195)
q = float(25)
d = float(10)
n = float(5)
numberQ = x/q
numberQ = int(numberQ)
money2 = x - (numberQ * q)
numberD = money2/d
numberD = int(numberD)
money3 = money2 - (numberD * d)
numberN = money3/n
numberN = int(numberN)
print numberQ
print numberD
print numberN
编辑:您也可以使用小数包来执行此操作:
from decimal import Decimal
x = Decimal('1.95')
q = Decimal('.25')
d = Decimal('.10')
n = Decimal('.05')
numberQ = x/q
numberQ = int(numberQ)
money2 = x - (numberQ * q)
numberD = money2/d
numberD = int(numberD)
money3 = money2 - (numberD * d)
numberN = money3/n
numberN = int(numberN)
print numberQ
print numberD
print numberN
答案 2 :(得分:1)
您似乎遇到了浮点精度错误;例如,在IDLE中运行代码后,请求money2
和money3
会给出以下值:
>>> money2
0.19999999999999996
>>> money3
0.09999999999999995
如果您想了解更多信息,Computerphile会在此here上播放一段精彩视频。除此之外,尝试转换它,以便钱由整数美分表示;即1.95美元将是195。
祝你好运。答案 3 :(得分:0)
问题是你的浮点值有时会接近实际值:在你的例子中,x = x * 100
q = 25
d = 10
n = 5
的值假设为0.2,但值可能是0.1999999 ...所以0.1999999 / 0.10 = 1.9999999999当你转换为int它将截断并变为1而不是2你想要的那样:
你可以尝试乘以100
for(int i=norm.length-1; i > 0; i--)
答案 4 :(得分:0)
我只是遇到了一个类似的问题,而且这个问题似乎奏效了,它可能比需要的时间更长:
编辑:为此,您输入一个整数-输入$ 78.65作为7865。
total = int(input())
if total == 0:
print('no change')
if total//100 >= 1:
if total//100 == 1:
print(total//100, 'dollar')
total = total % 100
elif total//100 > 1:
print(total//100, 'dollars')
total = total % 100
if total//25 >= 1:
if total//25 == 1:
print(total//25, 'quarter')
total = total % 25
elif total//25 > 1:
print(total//25, 'quarters')
total = total % 25
if total//10 >= 1:
if total//10 == 1:
print(total//10, 'dime')
total = total % 10
elif total//10 > 1:
print(total//10, 'dimes')
total = total % 10
if total//5 >= 1:
if total//5 == 1:
print(total//5, 'nickel')
total = total % 5
elif total//5 > 1:
print(total//5, 'nickels')
total = total % 5
if total//1 >= 1:
if total//1 == 1:
print(total//1, 'penny')
elif total//1 > 1:
print(total//1, 'pennies')
else:
total