Странное поведение int(x) в python

При запуске этой программы,

cost = 12
money = 12.51
change = money - cost

dollars = int(change)
change -= dollars

quarters = int(change / 0.25)
change -= quarters * 0.25

dimes = int(change / 0.1)
change -= dimes * 0.1

nickels = int(change / 0.05)
change -= nickels * 0.05

pennies = int(change / 0.01)

print("""Your change is:
    %i dollars
    %i quarters
    %i dimes
    %i nickels
    %i pennies
""" % (dollars, quarters, dimes, nickels, pennies))

Выход

Your change is:
    0 dollars
    2 quarters
    0 dimes
    0 nickels
    0 pennies

Почему копейки 0? Я пробовал печатать копейки отдельно, происходит то же самое. Я точно знаю, что change / 0.01 равно 1.0, По какой-то причине кажется, что int(1.0) равно 0, Очевидно, это не так. Может быть 1.0 число с плавающей запятой, которое на самом деле не 1 и получает 0?

Sidenote: удаление функции int на копейках и замена на %.0f pennies работает.

Я думаю, это именно то, о чем говорят люди, когда говорят, что не используют числа с плавающей запятой при работе с деньгами.:)

3 ответа

Решение

Мой заполненный код:

cost = input("What is the cost in dollars? ")
money = input("Money given: ")
change = int(round(money - cost) * 100)

if change < 0:
    print("You didn't pay enough!")
    exit()

dollars = change / 100
change %= 100

quarters = change / 25
change %= 25

dimes = change / 10
change %= 10

nickels = change / 5
change %= 5

pennies = change

print("""Your change is:
    %i dollars
    %i quarters
    %i dimes
    %i nickels
    %i pennies
""" % (dollars, quarters, dimes, nickels, pennies))

Я также точно знаю, что изменение / 0,01 равно 1,0

Ну, не совсем. Если вы попытаетесь сделать change / 0.01 непосредственно из интерпретатора Python, он возвращает что-то вроде 0.99999999999787 из-за ошибок с плавающей запятой. Естественно, если вы попытаетесь преобразовать это в int, оно округлится до нуля.

Чтобы избежать этого, вы можете попробовать одну из двух вещей. Вы можете либо попробовать использовать десятичный модуль из Python, который избегает ошибок с плавающей точкой, как эти, или вы можете умножить change на 100 в самом начале, так что вы имеете дело с целочисленными значениями, а не с числами с плавающей запятой, и соответственно измените остальную часть своего кода.

%.0f выполняет округление чисел, а %i не делает так Также учите математику!

Другие вопросы по тегам