Как сохранить точность в моей функции Python? - PullRequest
0 голосов
/ 23 сентября 2019

Все,

Я работаю над простой функцией, которая принимает значение и рассчитывает минимальное количество монет для распределения на основе значения.Я использовал 1,20 в качестве моей суммы.Таким образом, я должен вернуть 6 монет - 2 четверти и 2 цента.Для простоты я показываю только четверть кода.Когда я запускаю приведенный ниже пример кода, точность для операции сумма = сумма - четверти является правильной на протяжении первых двух итераций, однако, на третьей, сумма изменяется на 0,44999999999999996.

  • 1-я итерация: 0,95
  • 2-я итерация: 0,7
  • 3-я итерация: 0,44999999999999996

Знаете ли вы, почему это происходит, и как я могу решить эту проблему?Я попытался использовать десятичную. Десятичная и изменение точности.Я не хочу исправлять только форматирование, но хотел бы установить фактическую сумму, поскольку это важно для подсчета количества монет.

#amount for testing
amount = 1.20

#coins
quarter = 0.25

def min_coins(amount):
    count_quarter = 0
    while amount >= quarter:
        amount = amount - quarter
        print(amount)
        count_quarter += 1

min_coins(amount)

1 Ответ

2 голосов
/ 23 сентября 2019

Как отмечает Джон Гордон , для денежных приложений вы вообще не хотите использовать число с плавающей запятой.Либо используйте модуль decimal.Decimal для выполнения точных десятичных вычислений, либо выполняйте математику с int копейками вместо float долларов;если API должен принимать float долларов, преобразовать значения при входе и преобразовать обратно при возврате.Для вашего кода подход int пенни будет выглядеть так:

#amount for testing
amount = 1.20

#coins
quarter = 25

def min_coins(amount):
    amount = round(amount * 100)  # Convert from float dollars to int pennies
    count_quarter = 0
    while amount >= quarter:
        amount -= quarter
        print(amount)  # Or print('{:.2f}'.format(amount / 100)) if necessary
        count_quarter += 1

min_coins(amount)
...