Números em JavaScript
JavaScript suporta vários tipos de números. Entender como eles funcionam é essencial para programar com eficiência. Este artigo explica tudo.
Introdução aos Números em JavaScript
JavaScript é uma linguagem dinâmica, e a forma como armazena números tem consequências diretas no código do dia a dia: por que 0.1 + 0.2 não é exatamente 0.3, por que inteiros muito grandes perdem precisão e como arredondar, formatar e analisar valores com segurança. Esta página aborda o tipo number regular, os valores especiais Infinity e NaN, as funções de conversão e as armadilhas que pegam a maioria dos desenvolvedores — com exemplos executáveis que você pode editar.
Entendendo os Tipos Numéricos
JavaScript tem exatamente dois tipos de dados numéricos:
number— o tipo do cotidiano. Utiliza o formato IEEE-754 de 64 bits ("ponto flutuante de dupla precisão"), portanto o mesmo tipo armazena tanto inteiros como42quanto decimais como3.14. Não existeintoufloatseparado.BigInt— para inteiros além do intervalo seguro denumber(mais detalhes abaixo). Um literal BigInt termina emn, por exemplo9007199254740993n.
Você pode diferenciá-los com typeof:
Escrevendo Números em JavaScript
Além de dígitos simples, JavaScript oferece algumas conveniências para melhorar a legibilidade:
let billion = 1e9; // scientific notation → 1000000000
let ms = 1e-6; // 0.000001 (one microsecond)
let big = 1_000_000; // underscores as visual separators (ES2021)1e9 significa "1 seguido de 9 zeros"; 1e-6 significa "mover o ponto decimal 6 casas para a esquerda." Os sublinhados em 1_000_000 são ignorados pelo motor — eles apenas ajudam os humanos a ler números grandes.
Números Hexadecimais, Binários e Octais
JavaScript pode ler literais em vários sistemas de numeração. Todos são armazenados como o mesmo tipo number — apenas a notação difere:
let hex = 0xFF; // 255 (base 16, prefix 0x)
let bin = 0b1010; // 10 (base 2, prefix 0b)
let oct = 0o744; // 484 (base 8, prefix 0o)O Método toString
num.toString(base) converte um número para uma string em qualquer base de 2 a 36 — a direção inversa dos literais acima:
Observação: para chamar um método diretamente em um literal, você precisa de dois pontos ou parênteses — 255..toString(16) ou (255).toString(16) — porque 255. é lido como um ponto decimal.
Métodos de Arredondamento
JavaScript fornece várias funções para arredondar números:
Math.floor(): Arredonda um número para baixo até o inteiro mais próximo.
Math.ceil(): Arredonda um número para cima até o inteiro mais próximo.
Math.round(): Arredonda um número para o inteiro mais próximo, seguindo as regras matemáticas padrão.
Math.trunc(): Remove quaisquer dígitos fracionários, truncando essencialmente o número.
A diferença entre Math.floor e Math.trunc só aparece com negativos: Math.floor(-3.5) é -4 (arredonda em direção a -Infinity), enquanto Math.trunc(-3.5) é -3 (apenas descarta a fração). Para mais funções de arredondamento e matemáticas, consulte o capítulo de JavaScript Math.
Formatando Números: toFixed e toPrecision
Quando você precisa de um número como string com um formato fixo — dinheiro, porcentagens, relatórios — use esses métodos em vez de Math.round:
toFixed(digits)mantém um número fixo de dígitos após o ponto decimal.toPrecision(digits)mantém um número fixo de dígitos significativos.
Ambos retornam strings. Envolva o resultado em Number() se precisar de um número de volta. toLocaleString() é a melhor opção para separadores de milhar e moeda na localidade do usuário.
Lidando com Cálculos Imprecisos
Como o tipo number é de ponto flutuante binário, algumas frações decimais não podem ser armazenadas com exatidão — o famoso 0.1 + 0.2 !== 0.3. Isso não é um bug do JavaScript; toda linguagem IEEE-754 tem esse problema.
A regra geral: nunca compare resultados de ponto flutuante com ===. Ou arredonde ambos os lados primeiro, ou verifique se a diferença é menor que Number.EPSILON (o menor intervalo entre 1 e o próximo número representável).
Inteiros Seguros
Um number pode armazenar inteiros com exatidão apenas até Number.MAX_SAFE_INTEGER (2^53 − 1). Além disso, dois inteiros diferentes podem colapsar para o mesmo valor:
Se você trabalha com IDs, timestamps em nanossegundos ou contadores grandes que excedem esse limite, use BigInt.
Valores Numéricos Especiais
Entendendo Infinity, -Infinity e NaN em JavaScript:
- Infinity: Representa o infinito, um valor maior do que qualquer outro número. Você obtém esse resultado ao dividir um número por zero ou ao ultrapassar o limite superior dos números de ponto flutuante.
- -Infinity: Representa o infinito negativo, um valor menor do que qualquer outro número. Isso ocorre ao dividir um número negativo por zero ou ao ultrapassar o limite inferior dos números de ponto flutuante.
- NaN: Significa "Not-a-Number" (Não é um Número). Esse valor resulta de uma operação matemática indefinida ou não representável, como dividir zero por zero.
Os métodos isNaN() e isFinite() para verificar esses valores especiais:
isNaN(): Verifica se um valor éNaN. Observe que oisNaN()global realiza coerção de tipo implícita, portantoisNaN('hello')retornatrue. Para verificação de tipo estrita, useNumber.isNaN(), que só retornatruese o valor for realmenteNaN.isFinite(): Verifica se um valor é um número finito, retornandofalseparaInfinity,-InfinityouNaN.
Exemplos:
isNaN('hello')retornatrueporque a string é convertida paraNaN.isFinite(2 / 0)retornafalse, pois2 / 0resulta emInfinity, que não é finito.
Conversão Numérica: Number(), parseInt e parseFloat
Existem três maneiras comuns de transformar uma string em número, e escolher a certa é importante.
Number(value) é estrito: a string inteira deve ser um número válido (espaços em branco são removidos), caso contrário você obtém NaN. Uma string vazia se torna 0.
parseInt(value, radix) é tolerante: lê da esquerda e para no primeiro caractere que não faz parte de um inteiro. Se o primeiro caractere não puder ser analisado, retorna NaN. Sempre passe o radix (base) para evitar surpresas.
parseFloat(value) é como parseInt, mas entende o ponto decimal, lendo até encontrar um caractere que não faça parte de um número de ponto flutuante:
Regra geral: use Number() quando a string deve ser totalmente numérica (por exemplo, validando entrada de formulário), e parseInt/parseFloat quando precisar extrair um número de um texto como '100px'.
Conclusão
JavaScript armazena todos os números do cotidiano como valores de ponto flutuante de 64 bits, o que explica as peculiaridades de arredondamento, o limite de inteiros seguros e por que a formatação e a comparação exigem cuidado. Saber quando usar toFixed, Number.EPSILON, BigInt ou parseInt permite escrever código que se comporta de maneira previsível. Continue com os guias de tipos relacionados: Strings, BigInt, o objeto Math e Tipos de Dados.