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.Decimalpara a soma principal. - Imprimir o total com exatamente duas casas decimais.
- Comparar com a soma em
floate imprimirIguais? TrueouIguais? 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
input()lê cada preço como string.Decimal(p1)cria um decimal exato a partir da string, sem passar porfloat.- Somamos os três
Decimale formatamos com:.2fpara duas casas. - Calculamos a soma em
floatpara comparação. - Convertemos
total_floatpara string antes de criarDecimal, poisDecimal(float)usaria a representação binária exata. - 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 dofloatimpreciso, resultando em0.1000000000000000055511151231257827021181583404541015625. - Comparar
Decimalcomfloatdiretamente:Decimal('0.3') == 0.3retornaFalse; converta um dos lados. - Esquecer o
fna 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