2016-02-19 5 views
3

Я пытаюсь вычислить количество кварталов, копейки и никеля, которые необходимо суммировать до суммы изменения с наименьшими монетами. Вот мой код:Python: change calculator

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

protip: написать функцию, которая выясняет, как многие $ монеты могут быть выведены из $ total и возвращают $ остаток –

+0

Какая версия Python? Это важно, когда вы используете '/'. –

+0

Возможно, вы захотите объединить все свои целые числа после деления. – wrkyle

ответ

3

Проблема заключается в втором шаге. Если вы начинаете с 1.95, первый шаг возвращает 7 кварталов с остатком $ 0.20. Итак, money2 теперь 0,20. Теперь мы делим на величину десяти центов. Из-за ошибки с плавающей запятой наш результат, скорее всего, не ровный 2, а более похожий на 1.9999999. Python 2.7's 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 

% дает остаток от деления нацело. Если мы вычтем остаток от суммы, с которой мы начали, и разделим ее на значение монеты, мы знаем, что результатом будет целое целое число. Остаток становится новой суммой денег.

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 

Online Example

Edit: Вы можете также использовать десятичную пакет, чтобы сделать это:

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 
1

Вы, кажется, работает в ошибки точности с плавающей запятой; например, после запуска кода в IDLE, запрашивая money2 и money3 дает следующие значения:

>>> money2 
0.19999999999999996 
>>> money3 
0.09999999999999995 

Computerphile имеет хорошее видео на этом here, если вы хотели бы узнать больше. Кроме того, попробуйте преобразовать его так, чтобы деньги были представлены целым числом центов; то есть 1,95 долл. США будет 195.

Удачи.

0

проблема заключается в том, что ваше значение поплавка когда-нибудь приблизится к реальному значению: в вашем примере значение money2 должно быть 0,2, но значение может быть 0.1999999 ... так 0.1999999/0.10 = 1.9999999999 при преобразовании в целое будет укоротить и стать 1, а не 2, как вы хотите:

вы можете попробовать умножить на 100

x = x * 100 
q = 25 
d = 10 
n = 5 

Online Example