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)ouMath.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 umNumber.
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.