Странное поведение 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
не делает так Также учите математику!