1
resposta

[Projeto] Gerador de funções

from decimal import Decimal, InvalidOperation


def solicitar_valor_da_compra():
    while True:
        entrada = input('Digite o valor da compra: ').replace(',', '.').strip()
        try:
            valor = Decimal(entrada)
            if valor < 0:
                raise ValueError('O valor da compra não pode ser negativo. Tente novamente.')
            return valor.quantize(Decimal('0.01'))
        except (InvalidOperation, ValueError) as erro:
            print(f'Erro: {erro}. Digite um valor numérico válido (Ex: 49.90)')


def porcentagem_do_desconto():
    while True:
        try:
            porcentagem = int(input('Digite a porcentagem do desconto: '))
            if porcentagem < 0:
                raise ValueError('A porcentagem de desconto não pode ser negativa. Tente novamente.')
            return porcentagem
        except ValueError:
            print('Erro! Insira um valor válido (Ex: 20)')


def exibir_valor_final():
    valor_produto = solicitar_valor_da_compra()
    desconto = porcentagem_do_desconto()
    valor_com_desconto = valor_produto * (1 - Decimal(desconto) / 100)
    print(f'Valor final com desconto: R$ {valor_com_desconto:.2f}')


def main():
    exibir_valor_final()


if __name__ == '__main__':
    main()
1 resposta

E aí, Matheus! Tudo bem?

Parabéns! Mantenha o ritmo nos exercícios e continue compartilhando na nossa comunidade.

Percebi que você dominou o uso do Decimal para precisão nos valores monetários, aplicou muito bem a validação de entradas para garantir a consistência dos dados e ainda entendeu a relevância de estruturar o código em funções para organização e reutilização.

Uma sugestão para evoluir ainda mais é usar o getcontext().prec da biblioteca decimal com o objetivo de controlar a precisão global das operações. Veja só:

from decimal import Decimal, getcontext

getcontext().prec = 6  # Define a precisão global
valor = Decimal('10.45678') / Decimal('3')
print(valor)

Resultado:

3.48559

Essa abordagem ajuda a evitar erros de arredondamento acumulados em operações mais complexas.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!