Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Soma com número grande retornando um valor decimal diferente

Olá.

Na aula, somente como exemplo para o parâmetro start da built-in function sum(), o professor colocou o valor de um milhão:

sum(dados.values(), 1000000)

Isso retornou um float com várias casas decimais:

1267072.7399999998

Por favor, saberiam explicar por que o retorno se comportou assim? Todos os números eram com 2 casas decimais que, na soma "normal" seria 74 e não 7399999998.

Para complementar, dados é esse dicionário:

dados = {'Jetta Variant': 88078.64, 'Passat': 106161.94, 'Crossfox': 72832.16}

Obrigado!

1 resposta
solução!

Oii Matheus, tudo tranquilo?

Essa questão da imprecisão com números decimais não é exclusiva do Python, mas sim da computação e de como ela lida com números de ponto flutuante (números decimais). Isso acontece por conta da aritmética de ponto flutuante.

Aqui na Alura, temos um artigo que explica de forma detalhada e muito didática porque isso acontece:

Além disso, existe uma parte na documentação do Python reservada apenas para explicar esse problema e também já respondi um outro tópico de forma bem detalhada sobre como o Python trabalha com números decimais por baixo dos panos. Vou deixar os links desses dois conteúdos aqui caso queira se aprofundar:

Uma forma de conseguir fazer uma soma precisa utilizando números decimais, é utilizar a função fsum da biblioteca math. Essa função terá um comportamento muito semelhante a função sum com a exceção de que ela corrige imprecisões de números decimais.

Essa função recebe apenas um parâmetro, então para fazer a soma, você deve passar todos os valores que deseja somar em uma tupla/lista, por exemplo. Sendo assim, vamos utilizá-la agora para fazer a mesma soma anterior que você fez:

from math import fsum

dados = {'Jetta Variant': 88078.64, 'Passat': 106161.94, 'Crossfox': 72832.16}

# colocando todos os valores que queremos somar em uma única lista
lista_soma = list(dados.values())
lista_soma.append(1000000)

# somando os valores
fsum(lista_soma)

Resultado:

1267072.74

Assim, percebemos que essa função faz a soma de forma mais precisa :)

Espero que tenha conseguido te ajudar. Qualquer dúvida estou à disposição ^^

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software