Em JavaScript ou em Python, 0.1 + 0.2 dá 0.30000000000000004, e não 0,3. Acontece em qualquer computador, porque ele guarda os decimais como frações de denominador 2, 4, 8, 16… e o 0,1 não pode ser escrito assim. A conta com frações, 1/10 + 2/10, dá 3/10 e não perde nada.
Exemplo resolvido: a mesma soma com frações
Some 0,1 e 0,2 sem números binários.
- Escreva cada decimal como fração. 0,1 = 1/10 e 0,2 = 2/10.
- Some os numeradores. Os denominadores já são iguais: 1 + 2 = 3.
- Mantenha o denominador. O resultado não pode ser simplificado.
Resultado: 0,3, sem erro.
Verificação: 3/10 são três décimos, e 0,1 + 0,2 também são três décimos.
Para passar qualquer decimal para fração, use a calculadora de decimal para fração, que parte dos dígitos escritos.
O que o computador guarda de verdade
As linguagens de programação usam quase sempre números de ponto flutuante em precisão dupla (IEEE 754). Cada um é uma fração cujo denominador é uma potência de 2. Ao escrever 0,1, o programa guarda a mais próxima: 3602879701896397/2⁵⁵, que vale 0,1000000000000000055511151231257827… É um pouco mais que 0,1. A documentação do Python indica que o valor guardado para 0.1 é a fração binária 3602879701896397 / 2**55, próxima de 1/10, mas não igual.
A saída arredonda ao mostrar o número, e por isso 0.1 parece correto. Pedindo mais casas, a diferença aparece.
| Escrito | Guardado | Diferença em relação ao escrito |
|---|---|---|
| 0,1 | 0,1000000000000000055511… | +5,6 × 10⁻¹⁸ |
| 0,2 | 0,2000000000000000111022… | +1,1 × 10⁻¹⁷ |
| 0,3 | 0,2999999999999999888977… | −1,1 × 10⁻¹⁷ |
| Soma guardada de 0,1 + 0,2 | 0,3000000000000000444089… | +4,4 × 10⁻¹⁷ em relação a 0,3 |
O 0,2 guardado é exatamente o dobro do 0,1 guardado, então carrega o dobro do erro. Ao somar, o resultado é arredondado de novo para a fração binária mais próxima, e esse número é diferente do que foi guardado para 0,3. Os dois ficam em lados opostos de 3/10, e por isso a comparação 0.1 + 0.2 == 0.3 dá falso. A soma do computador está certa; o que muda são os números de partida.
Por que 1/10 não cabe no binário
Uma fração irredutível tem escrita finita numa base quando o denominador usa apenas os fatores primos dessa base. Na base 10, são o 2 e o 5. Na base 2, só o 2. O denominador 10 tem um fator 5, então em binário a escrita se repete sem fim: 0,000110011…₂, com o bloco 0011. É o mesmo fenômeno que faz 1/3 ser 0,333… na base 10, com outro número primo e outra base. O guia de frações com decimal exato desenvolve a regra na base 10, e o de decimais exatos e periódicos explica como se escreve um período.
Para distinguir os dois casos, observe o denominador depois de simplificar.
| Decimal | Fração | Exato em binário? |
|---|---|---|
| 0,5 | 1/2 | Sim, denominador 2 |
| 0,125 | 1/8 | Sim, denominador 8 = 2³ |
| 0,625 | 5/8 | Sim, 0,101₂ |
| 0,2 | 1/5 | Não, o denominador 5 não é potência de 2 |
| 0,3 | 3/10 | Não, o denominador 10 tem um fator 5 |
| 0,75 | 3/4 | Sim, denominador 4 |
Entre os décimos, só o 0,5 é guardado sem erro; os quartos e os oitavos também. Para ver o decimal de qualquer fração e saber se ele termina ou se repete, use a calculadora de fração para decimal.
O que fazer na prática
Há três saídas, conforme a necessidade.
- Comparar: aceite dois valores como iguais se a diferença entre eles for menor que uma tolerância razoável para o problema. O Python oferece
math.isclose()para isso. - Calcular com precisão: use frações ou aritmética decimal. O Python inclui os módulos
fractionsedecimal; o segundo foi pensado, segundo a documentação, para contabilidade e alta precisão. - Mostrar: arredonde só ao imprimir. O valor guardado não muda.
Com valores em dinheiro, outra opção é contar em centavos (cêntimos, em Portugal) com números inteiros e dividir por 100 só ao mostrar. Assim, R$ 12,50 vira 1250 centavos. Os inteiros até 2⁵³ são guardados sem perda, então cada soma sai sem erro. A decisão concreta depende de cada sistema.
A calculadora deste site segue o mesmo princípio: opera com inteiros e frações, e por isso 0,1 + 0,2 dá 3/10 na calculadora de frações. O decimal que aparece é uma apresentação do resultado, e a fração é o valor de referência. A metodologia explica como os cálculos são feitos e conferidos.
Fonte: documentação do Python em português, Aritmética de ponto flutuante: problemas e limitações (consultado em 17 de outubro de 2026). Os valores da tabela foram conferidos com aritmética exata de frações.