Не понимаю суть задачи

Пекарня продает хлеб по 49 рублей за буханку. Скидка на вчерашний хлеб составляет 60 %. Напишите программу, которая будет запрашивать у пользователя количество приобретенных вчерашних буханок хлеба. В вывод на экран должны быть включены обычная цена за буханку, цена со скидкой и общая стоимость приобретенного хлеба. Все значения должны быть выведены на отдельных строках с соответствующими описаниями. Используйте для вывода формат с двумя знаками после запятой и 5-ю знакоместами.

import math
from decimal import Decimal
a = float(input("Сколько буханок вы приобрели: ")) # a - количество приобретеных буханок
b = float(49) # цена буханки хлеба, (если умнжаем на число с пятью разрядами, то наверное и произведение будет с  пятью разрядами?
c = 0.6 # скидка на вчерашинй хлеб
print("Количество приобретенных буханок -", '%.2f' % a, "Цена одной бухнки -", '%.2f' % b, "Сумма покупки -", '%.2f' % a * b, "Сумма с учетом скидки -", '%.2f' % a * c * b, "Скидка -", '%.2f' % a * b - a * c * b, sep="\n")

Не могу понять как в питоне указать количество разрядов и почему он не хочет печатать с определенным количеством знаков после точки


Ответы (2 шт):

Автор решения: Алексей Р

Удобнее использовать f-строки. Общая ширина вывода задается выражением вида _>5, где сначала идет заполнитель, потом знак выравнивания, далее - ширина. Если ширина значения меньше, чем указанное кол-во символов, то недостающие знакоместа дополняются символом-заполнителем. Если больше, то выводится все. В примере ниже только 100 меньше чем 5 символов, поэтому дополнено __. Цена со скидкой должна считаться как произведение цены на (1-скидка). Т.е. если скидка 0.6, то цена умножается на 0.4

a = int(input("Сколько буханок вы приобрели: "))  # a - количество приобретенных буханок
b = 49  # цена буханки хлеба
c = 0.6  # скидка на вчерашний хлеб
width, fill_char = 5, '_'
print(f'Количество приобретенных буханок {a:{fill_char}>{width}d}, цена одной буханки {b:{fill_char}>{width}.2f}, cумма покупки {a * b:{fill_char}>{width}.2f}, cумма с учетом скидки {a * b * (1 - c):{fill_char}>{width}.2f}, скидка {a * b * c:{fill_char}>{width}.2f}')
Сколько буханок вы приобрели: 100
Количество приобретенных буханок __100, цена одной буханки 49.00, cумма покупки 4900.00, cумма с учетом скидки 1960.00, скидка 2940.00
→ Ссылка
Автор решения: CrazyElf

А что касается ошибки в вашем коде, то она сводится к такому примеру:

print("Сумма покупки -", '%.2f' % 10 * 49.0)

TypeError: can't multiply sequence by non-int of type 'float'

Это происходит потому, что сначала происходит форматирование '%.2f' % 10, а потом уже результат, т.е. строка '10.00', пытается умножиться на число с плавающей точкой 49.0 и не может этого сделать. Причём, на целое то число строку (и вообще последовательности) можно умножать - они таким образом размножаются в указанное число раз. А на дробное число строки умножать нельзя.

Так что данная проблема решается просто скобками:

"Сумма покупки -", '%.2f' % (a * b)
                            ^^^^^^^ берём в скобки

Но ещё лучше было бы поместить результаты всех расчётов в отдельные переменные и потом использовать интерполяцию строк, как написано в другом ответе. Т.е. как-то так:

purchase_sum = a * b
print(f"Сумма покупки - {purchase_sum:5.2f}")

Так и понятнее из кода, что вообще происходит, и сложнее запутаться в знаках процента, умножения и т.д.

→ Ссылка