2014-11-10 6 views
-2

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

Когда он отображает доллары, однако, он округляет ответ.

Например, если сумма составляет 82 цента, она заявляет, что у меня есть 1 доллар, в то время как мне нужно сказать 0 долларов.

Я не могу использовать round функция здесь.

Это даже умная вещь для использования или должна ли я придерживаться функции format?

def main(): 
    pennies = get_input("Enter pennies : ") 
    nickels = get_input("Enter nickels : ") 
    dimes = get_input("Enter dimes : ") 
    quarters = get_input("Enter quarters : ") 

    print("You Entered : ") 
    print("\tPennies : " , pennies) 
    print("\tNickels : " , nickels) 
    print("\tDimes  : " , dimes) 
    print("\tQuarters : " , quarters) 

    total_value  = get_total(   pennies, nickels, dimes, quarters) 
    dollars   = get_dollars(  pennies, nickels, dimes, quarters) 
    left_over_cents = get_left_over_cents(pennies, nickels, dimes, quarters) 

    print("Total = $",format(total_value, ".2f"), sep = "") 
    print("You Have", format(dollars, ".0f"), "dollars and", left_over_cents, "cent(s)") 

def get_input(message): 
    notify = int(input("I don't know")) 
    while notify >= 0: 
     return notify 

def get_total(pennies, nickels, dimes, quarters): 
    pennies   = .01 * pennies; 
    nickels   = .05 * nickels; 
    dimes   = .10 * dimes; 
    quarters  = .25 * quarters; 
    total_value  = pennies + nickels + dimes + quarters 
    return total_value 

def get_dollars(pennies, nickels, dimes, quarters): 
    pennies   = .01 * pennies; 
    nickels   = .05 * nickels; 
    dimes   = .10 * dimes; 
    quarters  = .25 * quarters; 
    total_value  = pennies + nickels + dimes + quarters 
    dollars   = total_value 
    return dollars 

def get_left_over_cents(pennies, nickels, dimes, quarters): 
    pennies   = .01 * pennies; 
    nickels   = .05 * nickels; 
    dimes   = .10 * dimes; 
    quarters  = .25 * quarters; 
    total_value  = pennies + nickels + dimes + quarters 
    left_over_cents = total_value 
    return left_over_cents 

main() 
+5

Если вы считаете деньги, * никогда * не используйте плавучую точку вообще. Придерживайтесь целых чисел. –

+2

На самом деле, десятичный будет, вероятно, лучшим типом. –

+0

Демонстрировал, как использовать десятичное значение для округления до долларов. –

ответ

2

Обычно лучше всего использовать decimal.Decimal для денежных значений:

import decimal 
penny_value = decimal.Decimal('.01') 
nickle_value = decimal.Decimal('.05') 
dime_value = decimal.Decimal('.10') 
quarter_value = decimal.Decimal('.25') 

Если ты хранишь количество монет, нужно умножить приведенные выше константы вашего количества монет, и вы не будете имеют ошибки округления.

pennies = 2 
nickles = 1 
dimes = 0 
quarters = 3 

total_value = (pennies * penny_value + nickles * nickle_value + 
       dimes * dime_value + quarters * quarter_value) 
dollars = total_value.quantize(1, rounding=decimal.ROUND_DOWN) 

и dollars теперь Decimal('0'), который равен нулю.

>>> print total_value 
0.82 
>>> print dollars 
0 

Если вы хотите придерживаться Интс и плавает округлить, преобразовать в целое, которое будет круглый к нулю:

total_value = .82 

dollar_value = int(total_value) 

dollar_value теперь 0

Чтобы использовать этот подход, сделайте это:

def get_dollars(pennies, nickels, dimes, quarters): 
    pennies = .01 * pennies; 
    nickels = .05 * nickels; 
    dimes = .10 * dimes; 
    quarters = .25 * quarters; 
    total_value= pennies + nickels + dimes + quarters 
    dollars = int(total_value) 
    return dollars 
+0

Использование int (total_value) дало мне ответ, который мне нужен. Я должен был сделать: Печать («У вас есть», доллары, «доллары и», формат (left_over_cents, «. 2f»), «цент (ы)») и округленные мои центы до двух знаков после запятой требуется также. – emendemu

Смежные вопросы