HOWTO · JavaScript

Como converter um número de ponto flutuante em inteiro no JavaScript

Aprenda a truncar ou arredondar um Number do JavaScript, analisar texto decimal e evitar atalhos bit a bit inseguros.

Nesta página

JavaScript não possui tipos separados int e float; normalmente ambos são representados por Number. Para remover a parte fracionária de um valor numérico existente, use Math.trunc(), que trunca em direção a zero. Essa operação é chamada de truncamento em direção a zero:

console.log(Math.trunc(12.75));
console.log(Math.trunc(-12.75));

Saída:

12
-12

O método correto depende do resultado necessário:

  • Use Math.trunc(value) para descartar a parte fracionária em direção a zero.
  • Use Math.floor(value) ou Math.ceil(value) quando a direção do arredondamento importar.
  • Use Math.round(value) para escolher o inteiro mais próximo.
  • Use parseInt(text, 10) quando a entrada for texto decimal, não como padrão para truncar um Number.

Truncar um número com Math.trunc()

Math.trunc() retorna a parte inteira sem arredondar. Em valores positivos, remove tudo depois do ponto decimal. Em valores negativos, aproxima-se de zero: -12.75 torna-se -12, não -13.

const value = -12.75;

console.log(Math.trunc(12.75));
console.log(Math.trunc(value));

Saída:

12
-12

Essa costuma ser a escolha mais clara quando o valor já é numérico e você precisa manter apenas a parte inteira. Um valor entre -1 e 0 pode produzir zero negativo:

console.log(Object.is(Math.trunc(-0.5), -0));

Saída:

true

Se a aplicação precisar distinguir -0 de 0, trate esse caso explicitamente.

Escolher floor(), ceil() ou round() para arredondar

Truncamento e arredondamento são operações diferentes. Math.floor() retorna o maior inteiro menor ou igual ao valor, enquanto Math.ceil() retorna o menor inteiro maior ou igual. Essa diferença é especialmente importante para valores negativos:

const value = -12.75;

console.log(Math.floor(value));
console.log(Math.ceil(value));
console.log(Math.round(-1.5));

Saída:

-13
-12
-1

Use Math.floor() como limite inferior, Math.ceil() como limite superior e Math.round() quando o inteiro mais próximo for desejado. Em empates, Math.round() segue em direção ao infinito positivo; por isso Math.round(-1.5) retorna -1.

Analisar texto decimal com parseInt()

Quando a origem é uma string, parseInt() pode analisar seu prefixo inteiro. Passe 10 como base para texto decimal:

console.log(parseInt("12.75", 10));
console.log(Number.isNaN(parseInt("not a number", 10)));

Saída:

12
true

parseInt() segue regras de análise e pode parar ao encontrar um caractere inválido para a base. Portanto, é diferente de truncar um número existente. Por exemplo, Math.trunc(Number("12.75")) é adequado quando a entrada precisa ser convertida e validada por completo. Use Number.isNaN() ou outra validação quando a entrada puder ser inválida.

Evitar toFixed() e atalhos bit a bit na conversão geral

Number.toFixed() é um método de formatação. Ele arredonda para o número de casas decimais solicitado e retorna uma string, portanto não é um método geral de conversão para inteiro:

console.log(typeof (12.75).toFixed(0));

Saída:

string

Expressões bit a bit como value | 0, ~~value e value >> 0 também truncam em direção a zero, mas primeiro convertem o valor em um inteiro assinado de 32 bits. Valores fora desse intervalo podem dar a volta ao limite oposto:

console.log(2 ** 31 | 0);

Saída:

-2147483648

Use essas expressões apenas quando a coerção deliberada para Int32 assinado for necessária. Elas não são substitutos mais seguros ou claros para Math.trunc().

Limites a considerar

Number usa representação de ponto flutuante de precisão dupla IEEE 754. Inteiros só são representados exatamente até Number.MAX_SAFE_INTEGER e Number.MIN_SAFE_INTEGER; use Number.isSafeInteger() quando a aritmética exata importar e trate explicitamente valores não finitos:

console.log(Math.trunc(Infinity));
console.log(Math.trunc(NaN));

Saída:

Infinity
NaN

Math.trunc() não transforma Infinity, -Infinity ou NaN em inteiros finitos. Valide a entrada quando a aplicação exigir um inteiro seguro e finito.

Resumo

Para um número JavaScript existente, comece com Math.trunc(value) quando “inteiro” significar remover a parte fracionária em direção a zero. Escolha Math.floor(), Math.ceil() ou Math.round() conforme a regra de arredondamento. Use parseInt(text, 10) para texto decimal, lembre-se de que toFixed() produz texto formatado e evite atalhos bit a bit salvo quando a coerção assinada de 32 bits for intencional.