Счет Python через число с> =

Я изучаю Python (2.7) на данный момент, и упражнение говорит, чтобы написать программу, которая подсчитывает, сколько монет вам нужно заплатить определенную сумму. Мое решение таково:

sum = input("Bitte gebe einen Euro Betrag ein: ") coins = [] euro = [20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01] for i in euro: while sum >= i: sum -= i coins.append(i) print coins 

Это почти работает, но когда я ввожу, например, 17,79, он дает мне монеты за 17,78.

 Bitte gebe einen Euro Betrag ein: 17.79 [10, 5, 2, 0.5, 0.2, 0.05, 0.02, 0.01] 

Зачем? Это как-то связано с кругом?

5 Solutions collect form web for “Счет Python через число с> =”

Для расчета валюты лучше избегать типа float если это возможно, из-за скопления ошибок округления. Вы можете сделать это так, как это:

 amount= input("Bitte gib einen Euro Betrag ein: ") coins = [] cents = [2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1] amount = int(float(amount) * 100) for cent in cents: while amount >= cent: amount -= cent coins.append(cent) print [coin / 100.0 for coin in coins] 

Я также изменил имя переменной от sum до amountsum закроет встроенную функцию суммы.

Результат:

 Bitte gebe einen Euro Betrag ein: 17.79 [10.0, 5.0, 2.0, 0.5, 0.2, 0.05, 0.02, 0.02] 

Кроме того, вы можете реализовать это без внутреннего цикла while, например:

 for cent in cents: n = int(math.floor(amount / cent)) amount -= n * cent coins += [cent] * n 

Можно выйти из цикла раньше ( if not amount: break ) и избежать ненужных операций ( if not n: continue ), но я пропустил эти защиты для удобства чтения.

Другой возможной альтернативой является использование decimal типа данных.

В нем есть. Если после выполнения кода вы проверяете значение «sum», вы получаете что-то вроде 0,009999999999999133, которое меньше, чем самая маленькая монета.

Мое предложение? Делайте все в центах!

 sum = int(input("Your text") * 100) cents = [2000,1000,500,200,100,50,20,10,5,2,1] coins = [] for i in euro: while True: if i <= sum: coins.append(i) sum -= i else: break for i in range(len(coins)): coins[i] /= 100 print(coins) 

Это проблема, связанная с точностью float . После расчета я получаю:

 sum == 0.009999999999999133 

т.е. чуть меньше одного евроцента (обратите внимание, вы не должны называть его sum потому что тогда вы затушевываете встроенную функцию sum и не можете использовать, например, sum(coins) чтобы получить общее количество). Вы можете исправить это с помощью подхода допуска, заменив

 while sum >= i: 

с

 while (sum - i) > -0.001: # allow for slight inaccuracy 

Точно так же лучше сравнить поплавки с использованием допуска, а не:

 if a == b: 

использование

 if abs(a - b) < tolerance: 

Действительно, как было указано, это, кажется, проблема округления, так как алгоритм (для этого набора монет!) Правильный. Если вы храните монеты как целые числа в центах, вычисляется правильное решение:

 s = input("Bitte gebe einen Euro-Cent Betrag ein: ") coins = [] euro = [2000,1000,500,200,100,50,20,10,5,2,1] for i in euro: while s >= i: s -= i coins.append(i) print coins 

Вывод:

 Bitte gebe einen Euro-Cent Betrag ein: 1779 [1000, 500, 200, 50, 20, 5, 2, 2] 

Кстати, я бы рекомендовал не использовать sum в качестве имени переменной, так как это имя встроенной функции.

@BartoszKP отметил, что лучше избегать использования float и потому, что вы можете столкнуться с некоторыми неприятными десятичными знаками, которые вам не понравятся. Таким образом, вы можете использовать round с минимальными изменениями в своем коде, вы можете сделать это:

 sum = input("Bitte gebe einen Euro Betrag ein: ") coins = [] euro = [20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01] for i in euro: while sum >= i: sum -= round(i,2) coins.append(i) if sum > 0: coins.append(round(sum,2)) print coins 

[вне:]

 Bitte gebe einen Euro Betrag ein: 19.99 [10, 5, 2, 2, 0.5, 0.2, 0.2, 0.05, 0.02, 0.01, 0.01] 

Но это НЕ оптимальное решение, так как вам нужно это вместо этого;)

 Bitte gebe einen Euro Betrag ein: 19.99 [10, 5, 2, 2, 0.5, 0.2, 0.2, 0.05, 0.02, 0.02] 
  • Прочитать файл в App Engine с помощью Python?
  • если возвращаемое значение для метода `__enter__` всегда будет` self` в python
  • Как я могу отформатировать timedelta для отображения
  • передача переменных в шаблон при перенаправлении в python
  • Python завершает работу после вызова конструктора
  • Модуль google_auth_httplib2 не найден после того, как pip установил google-cloud. Как я могу его исправить?
  • Функция печати Python получает неожиданный вывод в интерпретаторе?
  • Мусор в файле после усечения (0) в Python
  • разница между len () и .__ len __ ()?
  • Содержание
  • Копирование содержимого переменной в буфер обмена
  • Python - лучший язык программирования в мире.