Odd behavior of int(x) in python

Refresh

December 2018

Views

164 time

2

When running this program,

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))

The output is

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

Why is pennies 0? I've tried printing pennies separately, same thing happens. I know for certain as well that change / 0.01 is equal to 1.0. For some reason, it seems that int(1.0) is equal to 0. Obviously, it's not. Maybe 1.0 is a floating point number that isn't actually 1 and gets floored to 0?

Sidenote: Removing int function on pennies and replacing with %.0f pennies works.

I guess this is exactly what people talk about when they say not to use floating point numbers when working with money. :)

3 answers

0

%.0fвыполняет округление по номерам, а %iне делать это. Кроме того , изучить математику!

2

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

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

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

0

Мой код завершения:

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))