Médio Python

Somando com Decimal

Enunciado

Leia três preços como strings, converta para Decimal e some-os. Imprima o total com duas casas decimais. Em seguida, compare com a soma usando float e mostre se os resultados são iguais.

Requisitos

  • Usar decimal.Decimal para a soma principal.
  • Imprimir o total com exatamente duas casas decimais.
  • Comparar com a soma em float e imprimir Iguais? True ou Iguais? False.

Código inicial

from decimal import Decimal

p1 = input("Preço 1: ")
p2 = input("Preço 2: ")
p3 = input("Preço 3: ")

# complete aqui

Saída esperada

Total Decimal: 0.30
Iguais? False
Ver dica

Converta as strings diretamente para Decimal para evitar o erro de representação do float.

Mostrar solução
from decimal import Decimal

p1 = input("Preço 1: ")
p2 = input("Preço 2: ")
p3 = input("Preço 3: ")

d1 = Decimal(p1)
d2 = Decimal(p2)
d3 = Decimal(p3)

total_decimal = d1 + d2 + d3
print(f"Total Decimal: {total_decimal:.2f}")

total_float = float(p1) + float(p2) + float(p3)
print("Iguais?", total_decimal == Decimal(str(total_float)))

Passo a passo

  1. input() lê cada preço como string.
  2. Decimal(p1) cria um decimal exato a partir da string, sem passar por float.
  3. Somamos os três Decimal e formatamos com :.2f para duas casas.
  4. Calculamos a soma em float para comparação.
  5. Convertemos total_float para string antes de criar Decimal, pois Decimal(float) usaria a representação binária exata.
  6. Comparamos os dois valores e imprimimos o resultado booleano.

Por que funciona

Decimal armazena decimais de forma exata (base 10), enquanto float usa base 2 e não representa 0.1 exatamente. Por isso, somas com float podem divergir do valor esperado, e a comparação retorna False.

Erros comuns

  • Fazer Decimal(0.1) diretamente: isso cria um decimal a partir do float impreciso, resultando em 0.1000000000000000055511151231257827021181583404541015625.
  • Comparar Decimal com float diretamente: Decimal('0.3') == 0.3 retorna False; converta um dos lados.
  • Esquecer o f na f-string: sem ele, {total_decimal:.2f} não é formatado.

Outra forma de resolver

Usar sum() com um gerador:

total_decimal = sum(Decimal(p) for p in (p1, p2, p3))

Saída esperada

Total Decimal: 0.30
Iguais? False