Executando verificação de segurança...
2

O guia de números com ponto flutuante

Por que meus números, como 0,1 + 0,2, somam 0,3 e, em vez disso, obtenho um resultado estranho como 0,30000000000000004?

Porque, internamente, os computadores usam um formato ponto flutuante binário que não pode representar com precisão um número como 0,1, 0,2 ou 0,3.

Quando o código é compilado ou interpretado, seu “0,1” já está arredondado para o número mais próximo naquele formato, o que resulta em um pequeno erro de arredondamento antes mesmo do cálculo acontecer.

Por que os computadores usam um sistema tão estúpido?

Não é estúpido, apenas diferente. Os números decimais não podem representar com precisão um número como 1/3.

Os computadores usam números binários porque são mais rápidos em lidar com eles e porque, para a maioria dos cálculos, um pequeno erro na 17ª casa decimal não importa, pois os números com os quais você trabalha não são redondos (ou tão precisos) de qualquer maneira.

O que posso fazer para evitar esse problema?

Isso depende do tipo de cálculo que você está fazendo.

  • Se você realmente precisa que seus resultados somem exatamente, especialmente quando você trabalha com dinheiro: use um tipo de dados decimal especial.
  • Se você simplesmente não quiser ver todas essas casas decimais extras: simplesmente formate seu resultado arredondado para um número fixo de casas decimais ao exibi-lo.
  • Se você não tiver nenhum tipo de dados decimal disponível, uma alternativa é trabalhar com números inteiros, por exemplo, fazer cálculos monetários inteiramente em centavos. Mas isso é mais trabalhoso e tem algumas desvantagens.

Por que outros cálculos como 0,1 + 0,4 funcionam corretamente?

Nesse caso, o resultado (0,5) pode ser representado exatamente como um número de ponto flutuante e é possível que os erros de arredondamento nos números de entrada se anulem - mas isso não pode ser necessariamente confiável (por exemplo, quando esses dois números foram armazenados em representações de ponto flutuante de tamanhos diferentes primeiro, os erros de arredondamento podem não compensar uns aos outros).

Em outros casos, como 0,1 + 0,3, o resultado não é realmente 0,4, mas próximo o suficiente para que 0,4 seja o menor número mais próximo do resultado do que qualquer outro número de ponto flutuante. Muitos idiomas exibem esse número em vez de converter o resultado real de volta para a fração decimal mais próxima.

Carregando publicação patrocinada...
1

Olá, Devs. Um amigo estava programando em C, ele me pediu para encontrar bugs na sua mini calculadora, o problema das casas decimais foi extremamente ruim, pois além de poluir a aplicação o resultado muito provavelmente ficará errado. Uma boa solução seria usar uma lib.