W3docs

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 como 42 quanto decimais como 3.14. Não existe int ou float separado.
  • BigInt — para inteiros além do intervalo seguro de number (mais detalhes abaixo). Um literal BigInt termina em n, por exemplo 9007199254740993n.

Você pode diferenciá-los com typeof:

javascript— editable

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:

javascript— editable

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:

  1. Math.floor(): Arredonda um número para baixo até o inteiro mais próximo.
javascript— editable
  1. Math.ceil(): Arredonda um número para cima até o inteiro mais próximo.
javascript— editable
  1. Math.round(): Arredonda um número para o inteiro mais próximo, seguindo as regras matemáticas padrão.
javascript— editable
  1. Math.trunc(): Remove quaisquer dígitos fracionários, truncando essencialmente o número.
javascript— editable

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.
javascript— editable

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.

javascript— editable

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:

javascript— editable

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 o isNaN() global realiza coerção de tipo implícita, portanto isNaN('hello') retorna true. Para verificação de tipo estrita, use Number.isNaN(), que só retorna true se o valor for realmente NaN.
  • isFinite(): Verifica se um valor é um número finito, retornando false para Infinity, -Infinity ou NaN.

Exemplos:

  • isNaN('hello') retorna true porque a string é convertida para NaN.
  • isFinite(2 / 0) retorna false, pois 2 / 0 resulta em Infinity, 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.

javascript— editable

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.

javascript— editable

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:

javascript— editable

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.

Prática

Prática
O que é verdadeiro sobre os números em JavaScript?
O que é verdadeiro sobre os números em JavaScript?
Was this page helpful?