2013-09-15 2 views
1

В основном это работает почти для всех случаев, которые я пробовал, кроме 0.93. Затем я добавил «печатать деньги» в то время цикла, чтобы посмотреть, что он делает после каждого цикла, и это было то, что случилось:Объяснение вывода моего кода на Python

Enter an amount less than a dollar: 0.93 
0.68 
0.43 
0.18 
0.08 
0.03 
0.02 
0.01 
3.81639164715e-17 
-0.01 
Your change is 3 quarters 1 dimes 1 nickels 4 pennies 

Может кто-нибудь объяснить, что, черт возьми, происходит?

money = input("Enter an amount less than a dollar: ") 
quarter = 0 
dime = 0 
nickel = 0 
penny = 0 

while money > 0.00: 
    if money >= 0.25: 
     quarter = quarter + 1 
     money = money - 0.25 

    elif money >= 0.10: 
     dime = dime+1 
     money = money - 0.10 

    elif money >= 0.05: 
     nickel = nickel + 1 
     money = money - 0.05 

    else: 
     penny = penny + 1 
     money = money - 0.01 



print "Your change is %d quarters %d dimes %d nickels %d pennies" % (quarter, dime, nickel, penny) 
+1

Я согласен с рекомендацией использовать арифметику целочисленной арифметики или десятичной дроби для денег. Однако, если вы действительно хотите понять основную проблему с использованием плавающей запятой, прочитайте [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568 /ncg_goldberg.html) –

ответ

14

числа с плавающей точкой can't represent most decimal fractions exactly, так же, как вы не можете написать результат 1/3 в точности, используя точку обозначения десятичных чисел с плавающей.

Используйте целые числа для вычисления с помощью центов вместо или используйте decimal module.

Это не имеет никакого отношения к Python, кстати, но с тем, как компьютеры обычно выполняют математику с плавающей запятой.

+3

Да, я тоже пойду целыми. Вы также можете использовать оператор модуля, вырезать 3/4 этого кода –

2
amount = 93 
quarters = amount // 25 
amount = amount % 25 
dimes = amount // 10 
amount = amount * 10 
nickel = amount // 5 
cents = amount % 5 

// - целочисленное деление. % является модуль оператора (остаток от целочисленного деления)

немного мысли вы могли бы пройти в списке [25,10,5,1] и сделать это в цикле

0

Вы не можете выразить большинство фракций точно с использованием плавающей запятой. Я думаю, что целые числа являются лучшим решением проблемы в вашем случае. Я переписал ваш код для использования центов и python 3.

cents = int(input("Enter a number of cents: ")) 
quarter = 0 
dime = 0 
nickel = 0 
penny = 0 

while cents > 0: 
    if cents >= 25: 
     quarter+=1 
     cents-=25 
    elif cents >= 10: 
     dime+=1 
     cents-=10 
    elif cents >= 5: 
     nickel+=1 
     cents-=5 
    else: 
     penny+=1 
     cents-=1 
print ("Your change is %d quarters %d dimes %d nickels %d pennies" % (quarter, dime, nickel, penny) 
Смежные вопросы