2013-09-18 3 views
1

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

amounts = (100, 50, 20, 10, 5, 2, 1, 0.25, 0.10, 0.05, 0.01) 
def get_change(full_amount): 
    final_change = [] 
    for amount in amounts: 
     number = 0 
     while full_amount >= amount: 
      if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break 
      number += 1 
      full_amount -= amount 
     final_change.append(number) 
    return final_change 

Предположим, я вхожу 2.40. Он идет от 2,40, до 0,40 (toonie), а затем он должен идти, до if (full_amount < 0.50 and full_amount > 0.10 and amount == 0.25): break он пропустит 0,25 и закончит с четырьмя копейками. Однако на самом деле он заканчивается 3-мизнами, одним никелем и всего четырьмя пенни. Проблема, как представляется, возникает, когда оставшаяся сумма равна проверенной сумме (0.10 центов и 0,10 цента в качестве суммы - и тому же с никелем)

+0

'(full_amount <0.50 и full_amount> 0.10 и amount == 0.25)' - почему первые две проверки? просто сделайте 'amount == 0.25'. Если одно из первых двух не будет выполнено, последняя проверка тоже будет - так что не делайте их –

+0

'1.4 - 1 == 0.3999999999999999'' –

ответ

2

Ответ здесь заключается в том, что вы не должны представлять неделимые значения в виде поплавков. Представьте все в центах.

Причина в том, что поплавки не могут точно представлять все десятичные числа. Соответственно, деление на разные суммы не будет делать то, что вы хотите. Вместо этого вам нужно разделить интегральные суммы и работать соответствующим образом с любыми остатками, которые происходят.

В общем, проверки равенства по поплавкам также опасны по этой причине: вместо этого вам нужно решить, какая разница «достаточно равно» и проверить на это.

1

Умножьте все на 100, чтобы избавиться от десятичных знаков. Таким образом, копейка должна составлять десять центов, доллар 100 центов и так далее. Поскольку поплавки не являются совершенными представлениями числа, вы не должны делать никаких равных проверок на них или удваивать.

Смежные вопросы