Por que 0,1 + 0,2 dá 0,30000000000000004

Por que a vírgula flutuante binária faz 0,1 mais 0,2 resultar em 0,30000000000000004, e como esta calculadora arredonda o valor de volta para 0,3.

Digite 0.1 + 0.2 em praticamente qualquer calculadora que trabalhe com vírgula flutuante binária e o resultado bruto é 0.30000000000000004, não 0.3. Esta calculadora produz internamente o mesmo valor e depois o arredonda para exibição, por isso você vê 0.3. O culpado é uma incompatibilidade de bases: os humanos escrevem números em base 10, os computadores os armazenam em base 2, e 0,1 não existe de forma exata em base 2.

Principais pontos

  • 0.1 + 0.2 é 0.30000000000000004 em vírgula flutuante binária, em qualquer linguagem.
  • 0,1 em binário é um padrão periódico, 0.0001100110011….
  • Esta calculadora arredonda os resultados para 12 algarismos significativos, por isso mostra 0.3, e não o double bruto.
  • O valor armazenado de 0,1 resulta em 0.10000000000000000555111512312578….

De onde vêm os dígitos extras

Você já sabe que algumas frações não cabem de forma limpa em base 10. Um terço é 0.333…, uma dízima periódica infinita, porque 3 não é um fator de 10. Os computadores armazenam números em base 2, onde as únicas frações “limpas” têm potências de dois no denominador: meios, quartos, oitavos. Um décimo não está nessa lista. Em binário, 0,1 é 0.0001100110011…, uma dízima periódica infinita, exatamente como um terço se repete em decimal.

Um número de precisão dupla tem 53 bits para os dígitos, então a expansão binária infinita acaba sendo cortada. O valor armazenado quando você digita 0,1 é 0.1000000000000000055511151231257827021181583404541015625. É próximo de 0,1, mas não é igual. Some dois desses valores ligeiramente imprecisos e os erros não se cancelam; eles se acumulam, e a soma acaba um passo além de 0,3. Daí 0.30000000000000004. É o padrão IEEE 754, implementado por praticamente todo processador e linguagem, por isso o mesmo resultado aparece em JavaScript, Python, C e Excel.

O que esta calculadora faz a respeito

O contrato de funcionamento deste site está descrito no guia de aritmética de vírgula flutuante: todo resultado é arredondado para 12 algarismos significativos antes de ser exibido. Um double carrega cerca de 15 a 17 dígitos confiáveis, então arredondar em 12 preserva todo dígito confiável e descarta os últimos, que é exatamente onde vive o ruído acumulado.

Exemplo resolvido 1: digite a expressão. Na calculadora principal, digite 0.1+0.2. O visor retorna 0.3. O double subjacente é 0.30000000000000004, mas a regra de exibição o esconde. Repita o mesmo truque na direção oposta com 0.3-0.2: o resultado bruto é 0.09999999999999998, e o visor mostra 0.1. A multiplicação também faz isso: 1.1*3 guarda 3.3000000000000003 e exibe 3.3.

Quando a resposta realmente não pode ser fixada com exatidão, a calculadora não finge que pode. Digite 1/3 e ela mostra 0.333333333333, doze algarismos três e para. O guia de algarismos significativos explica exatamente como funcionam esse arredondamento e esses limites de exibição.

Quando a diferença importa

Para aritmética do dia a dia, tarefas escolares e estimativas de engenharia, 12 dígitos confiáveis é muito mais precisão do que qualquer medição justifica. A diferença importa em três situações mais específicas, todas descritas no guia de aritmética de vírgula flutuante:

  • Dinheiro. Não armazene valores monetários como números de vírgula flutuante. Centavos como números inteiros são o caminho seguro, e o acúmulo de pequenos erros em totais é um tipo conhecido de bug contábil.
  • Comparações de igualdade em código. Testar se dois floats calculados são iguais é pouco confiável; compare com uma pequena margem de tolerância.
  • Longas cadeias de operações. Os erros se acumulam, e subtrair dois números quase iguais é o que mais faz perder precisão.

Exemplo resolvido 2: frações exatas. Quando você precisa de uma fração exatamente correta, a calculadora de frações mantém numeradores e denominadores como números inteiros e nunca arredonda. Digite 1/3 + 1/3 + 1/3 nela e o resultado é exatamente 1. Faça a mesma soma com os decimais exibidos, 0.333333333333 + 0.333333333333 + 0.333333333333, e o resultado é 0.999999999999. Mesma ideia, mundos diferentes.

Exemplo resolvido 3: raízes e potências. sqrt(2)^2 é uma armadilha clássica. Logicamente, a raiz quadrada de 2 ao quadrado é 2. Na calculadora, o resultado bruto é 2.0000000000000004, arredondado na exibição para 2. Quando você precisa do valor exato, mantenha a forma com a raiz e avalie apenas no passo final, algo que a referência de funções da calculadora discute na seção da tecla √.

Também há um limite inteiro que vale a pena conhecer. Abaixo de 2^53 − 1 = 9.007.199.254.740.991, todo número inteiro é representável de forma exata e a calculadora imprime todos os seus dígitos. Acima dessa linha, valores como 19! mudam para notação científica em vez de reivindicar uma precisão que não existe.

Perguntas frequentes

0,1 mais 0,2 é realmente 0,3 ou não?

Em aritmética decimal exata, sim. Em vírgula flutuante binária, o resultado armazenado é 0.30000000000000004. Esta calculadora retorna internamente esse mesmo valor e arredonda para 12 algarismos significativos na exibição, por isso você vê 0.3.

Isso é um bug da calculadora?

Não. É o padrão IEEE 754, implementado por praticamente todo processador e linguagem convencional. Programas e calculadoras que parecem evitar o problema estão apenas escondendo-o com arredondamento na exibição, exatamente como este.

Como posso obter uma resposta exata?

Use a calculadora de frações para aritmética racional, que nunca arredonda, ou mantenha formas simbólicas como sqrt(2) e pi na expressão até o passo final.

Por que 1 dividido por 3 mostra apenas doze algarismos três?

Porque um terço não tem representação exata em nenhuma das duas bases. A calculadora mostra doze dígitos confiáveis e para, em vez de fingir que o valor termina.