O conversor IEEE 754 mostra exatamente como um número decimal é armazenado em ponto flutuante de 32 bits (float) e 64 bits (double): bit de sinal, expoente e mantissa, além do valor real guardado na memória, que quase nunca é igual ao que você digitou.
O Famoso 0.1 + 0.2
> 0.1 + 0.2
0.30000000000000004
> 0.1 + 0.2 === 0.3
falseDigite 0.1 na calculadora e veja o valor armazenado: não é 0,1. Isso acontece em JavaScript, Python, Java, C e qualquer linguagem que use IEEE 754. Não é bug: é a consequência de representar frações decimais em base 2.
Fórmula do IEEE 754
valor = (−1)^sinal × 1.mantissa × 2^(expoente − viés)
float (32 bits): 1 sinal | 8 expoente | 23 mantissa | viés 127
double (64 bits): 1 sinal | 11 expoente | 52 mantissa | viés 1023Exemplo: −6,25 em Float
- Sinal negativo: bit de sinal = 1.
- 6,25 em binário = 110,01 = 1,1001 × 2².
- Expoente: 2 + 127 = 129 =
10000001. - Mantissa (sem o 1 inicial):
1001seguido de zeros. - Resultado:
1 10000001 10010000000000000000000=0xC0C80000.
Casos Especiais
- Zero: expoente e mantissa zerados (existe +0 e −0).
- Infinito: expoente com todos os bits 1 e mantissa zero.
- NaN: expoente com todos os bits 1 e mantissa diferente de zero.
- Subnormais: expoente zero e mantissa diferente de zero, para números muito próximos de zero.
Perguntas Frequentes
Por que 0.1 + 0.2 não é igual a 0.3?
Porque 0,1 não tem representação exata em binário, assim como 1/3 não tem em decimal. O computador guarda o double mais próximo, que é 0,1000000000000000055511151231257827. Somando os erros de 0,1 e 0,2, o resultado vira 0,30000000000000004.
Como é dividido um float de 32 bits?
1 bit de sinal, 8 bits de expoente (com viés de 127) e 23 bits de mantissa. O valor é (−1)^sinal × 1,mantissa × 2^(expoente − 127). O double de 64 bits usa 1, 11 e 52 bits, com viés de 1023.
Qual a diferença entre float e double?
Float (precisão simples) tem 32 bits e cerca de 7 dígitos decimais de precisão. Double (precisão dupla) tem 64 bits e cerca de 15 a 17 dígitos. JavaScript usa sempre double; C, Java e C# têm os dois tipos.
Como comparar números de ponto flutuante corretamente?
Nunca use igualdade direta. Compare se a diferença absoluta é menor que uma tolerância: Math.abs(a − b) < 1e-9. Para dinheiro, use inteiros (centavos) ou tipos decimais, como BigDecimal no Java.
