2010-07-11 6 views
9

При приеме пользовательского ввода с десятичной в Python Я использую:Указание количества знаков после запятой в Python

#will input meal subtotal 
def input_meal(): 
    mealPrice = input('Enter the meal subtotal: $') 
    mealPrice = float (mealPrice) 
    return mealPrice 

который возвращает именно то, что вводится - скажем, $ 43,45
, но при использовании этого значения для расчета и дисплей налог я использую:

#will calculate 6% tax 
def calc_tax(mealPrice): 
    tax = mealPrice*.06 
    return tax 

который возвращает отображение $ 2,607 с помощью

mealPrice = input_meal() 
tax = calc_tax(mealPrice) 
display_data(mealPrice, tax) 

Как я могу установить это вместо $ 2,61?
Простите меня, я понимаю, что это основные вещи, но они не назовут это Intro для ничего ...

Спасибо!

+0

Janet, FYI, вам нужна пустая строка перед вашими разделами кода. Или просто выделите их и нажмите кнопку «1010». (На этот раз я исправил отступы для вас) – Stephen

ответ

2

Вы не показывают код display_data, но вот то, что вам нужно сделать:

print "$%0.02f" %amount 

Это format specifier для переменной amount.

Поскольку это новичок, я не буду входить в floating point rounding error, но хорошо знать, что он существует.

+0

Лучший ответ здесь, спасибо! –

21

Существует несколько способов сделать это в зависимости от того, как вы хотите сохранить значение.

Вы можете использовать основные строки форматирования, например

'Your Meal Price is %.2f' % mealPrice 

Вы можете модифицировать 2 к любой точности вам нужно.

Однако, поскольку вы имеете дело с деньгами, вы должны изучить модуль decimal, который имеет классный метод с именем quantize, который предназначен для работы с денежными приложениями. Вы можете использовать его так:

from decimal import Decimal, ROUND_DOWN 
mealPrice = Decimal(str(mealPrice)).quantize(Decimal('.01'), rounding=ROUND_DOWN) 

Обратите внимание, что атрибут чисто необязателен.

+1

''% .2f '% mealPrice' работал красиво! (Я должен буду смотреть дальше в десятичный модуль, хотя - не мог заставить его работать) Большое спасибо! – Janet

+1

+1 для десятичной ссылки; с поплавками, вы получите неожиданные округления (например, попробуйте цену за еду в размере 0,25). Но я не думаю, что ваша десятичная строка работает: try 'quantize (Decimal ('0.01'))' вместо 'quantize ('. 01')'. –

+0

@Mark Спасибо! вы правы, это не так.Я исправил его, плюс у него была синтаксическая ошибка .. должен был протестировать мой код :) – Bartek

2

Для расчета налога, вы можете использовать round (в конце концов, это то, что ресторан делает):

def calc_tax(mealPrice): 
    tax = round(mealPrice*.06,2) 
    return tax 

Для отображения данных, вы можете использовать строку из нескольких строк, а string format method:

def display_data(mealPrice, tax): 
    total=round(mealPrice+tax,2) 
    print('''\ 
Your Meal Price is {m:=5.2f} 
Tax    {x:=5.2f} 
Total    {t:=5.2f} 
'''.format(m=mealPrice,x=tax,t=total)) 

Обратите внимание, что метод форматирования был введен в Python 2.6, для более ранних версий вы должны будете использовать старый стиль строки интерполяции %:

print('''\ 
Your Meal Price is %5.2f 
Tax    %5.2f 
Total    %5.2f 
'''%(mealPrice,tax,total)) 

Тогда

mealPrice=input_meal() 
tax=calc_tax(mealPrice) 
display_data(mealPrice,tax) 

выходы:

# Enter the meal subtotal: $43.45 
# Your Meal Price is 43.45 
# Tax     2.61 
# Total    46.06 
+0

Также отлично работает. Разве это значительно отличается от «Ваша цена на питание составляет% .2f '% mealPrice»? – Janet

+0

'% 5.2f' будет работать одинаково (см. Выше). Я начал использовать 'format' при подготовке к переносу на Python 3. Но для этого случая я ничего не делал с' format', который не может быть выполнен со строчной интерполяцией. – unutbu

7

Я удивлен вторым номером вы упоминаете (и подтверждаете свое запрошенное округление) - сначала я думал, что мой инстинкт умственной арифметики начал меня терпеть (I am все-таки стареет, так что это может происходить так же, как моя некогда резкая память! -) ... но потом я подтвердил, что пока не использовал, как я себе представляю, Python 3.1, и копирование и вставка ..:

>>> def input_meal(): 
...  mealPrice = input('Enter the meal subtotal: $') 
...  mealPrice = float (mealPrice) 
...  return mealPrice 
... 
>>> def calc_tax(mealPrice): 
...  tax = mealPrice*.06 
...  return tax 
... 
>>> m = input_meal() 
Enter the meal subtotal: $34.45 
>>> print(calc_tax(m)) 
2.067 
>>> 

... как и ожидалось - все же, вы говорите, что вместо «возвращает отображение $ 2,607» ... что может быть опечатка, просто поменяв две цифры, за исключением что вы затем спросите: «Как я могу установить это вместо $ 2,61?» поэтому действительно кажется, что вы действительно имеете в виду 2.607 (который может быть закруглен до 2,61 различными способами) и определенно не арифметически правильный результат, 2.067 (который в лучшем случае может быть округлен до 2.07 ... определенно не до 2,61 по вашему запросу) ,

Я предполагаю, что сначала у вас была опечатка в транскрипции, а затем мысленно вычислила желаемое округление от фальсифицированной опечатки 2.607, а не фактический исходный результат - это то, что произошло? ! Это точно удалось запутать меня на некоторое время -)

Во всяком случае, округлить поплавок до двух знаков после запятой, простой подходом является встроенной функцией round со вторым аргументом 2:

>>> round(2.067, 2) 
2.07 
>>> round(2.607, 2) 
2.61 

для чисел в точности на равном расстоянии между двумя возможностями, она округляет к еще:

>>> round(2.605, 2) 
2.6 
>>> round(2.615, 2) 
2.62 

или, как поместить его документы (иллюстрирующий с одним аргументом формой round, который округляется к ближайшему в Тегер):

если два кратных одинаково близки, округление производится в сторону даже выбора (так, например, как круглые (0,5) и круглые (-0,5) равны 0, и круглая (1.5) равно 2).

Однако для вычислений на деньги, я второй рекомендации, уже даны в других ответах, чтобы придерживаться с тем, что decimal модуль предлагает вместо float чисел.

+0

Просто nitpick: благодаря обычным двоичным проблемам с плавающей запятой '2.605' и' 2.615' не являются точно эквидистантными между двумя возможностями; так что это действительно просто до чистого шанса, что ваши круглые примеры выглядят так, как будто они дают результат «от половины к четному». 'round (2.635, 2)' дает '2.63', например. IOW, I * third * Важное значение имеет предложение попробовать десятичный модуль, если получить направление округления вправо. :) BTW, в Python 2.x, 'round' все еще округляет половину случаев от нуля, а не до четности. –

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