Como posso remover a parte decimal do número JavaScript?

218

Tenho os resultados de uma divisão e desejo descartar a parte decimal do número resultante.

Como posso fazer isso?

JacobTheDev
fonte

Respostas:

384

Você poderia usar ...

... depende de como você deseja remover o decimal.

Math.trunc()ainda não é suportado em todas as plataformas (a saber, IE), mas você pode facilmente usar um polyfill nesse meio tempo.

Outro método de truncar a parte fracionária com excelente suporte à plataforma é usar um operador bit a bit (.eg |0). O efeito colateral de usar um operador bit a bit em um número é que ele tratará seu operando como um número inteiro de 32 bits assinado, removendo, portanto, o componente fracionário. Lembre-se de que isso também altera números maiores que 32 bits.


Você também pode estar falando sobre a imprecisão do arredondamento decimal na aritmética de ponto flutuante.

Leitura obrigatória - O que todo cientista da computação deve saber sobre aritmética de ponto flutuante .

alex
fonte
29
Lembre-se de que Math.floor()isso aumentará o valor numérico quando o número for negativo . Assim Math.floor(-1.2) -> -2enquanto Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( como mencionado por @FloydPink ) descartará a parte decimal conforme o esperado para números positivos e negativos .
Paul T. Rawkeen
1
@ PaulT.Rawkeen Você também pode usar um operador bit a bit para descartar a parte decimal, mas lembre-se de que ele também trunca para 32 bits.
alex
2
O seguinte mostra esta resposta é instável:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake
4
@ Jake O resultado do 2.3*100javascript é 229.99999999999997, portanto, parece que o operador bit a bit está fazendo seu trabalho corretamente no seu exemplo.
Chad von Nau
Existe uma solução semelhante à |0que usa números inteiros de 64 bits?
Clint
49

Você também pode usar operadores bit a bit para truncar o decimal.

por exemplo

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

As operações bit a bit são consideravelmente mais eficientes que as funções matemáticas. O operador não bit a bit dupla também parece superar ligeiramente os x | 0e x << 0bit a bit operações por um valor insignificante.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Também digno de nota é que o operador bit a bit não tem precedência sobre operações aritméticas, portanto, pode ser necessário cercar os cálculos entre parênteses para obter o resultado pretendido:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Mais informações sobre o operador double bitwise not podem ser encontradas em Double bitwise NOT (~~)

Braden Steffaniak
fonte
2
Pode ser marginalmente eficiente. Mas, eu sugeriria funções 'Math', como é mais legível.
ashipj
As chances são de que isso não funciona se o inteiro não é representado como inteiros de 32 bits assinados ( stackoverflow.com/a/7488075/3655192 )
Hiroki
30

Você também pode fazer

parseInt(a/b)
Hari Pachuveetil
fonte
17
Observe que parseIntnão funcionará de maneira confiável para números grandes, porque ele primeiro converte seu argumento em uma string e, para números grandes, o resultado usará notação exponencial. Por exemplo: var n = 22222222222222222222222; parseInt(n);retornará 2, porque n.toString()retorna 2.2222222222222223e+22.
2
Também não está usando parseInt()para esse fim, que é pegar um número em uma string e retornar a Number.
alex
22

Você também pode mostrar um certo número de dígitos após o ponto decimal (aqui 2 dígitos) usando o seguinte código:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string

Mahdi ghafoorian
fonte
4
Esteja ciente de que toFixed () retorna uma String, não um Number. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Jeanmichel Cote
1
Como isso é uma resposta o OP pedindo para remover a parte decimal
Isaac
3
Embora ele retorna um string, você pode simplesmente usar o método Number () para corrigir isso .. Number ((15,46974) .toFixed (2))
iPzard
13

Use a Math.round()função

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Navdeep Singh
fonte
17
Para ser completo, é JavaScript simples, não consulta.
Dave Newton
1
$.round = Math.round;)
Alex
12

Use Math.round().

(A resposta de Alex é melhor; eu assumi :)

Dave Newton
fonte
6

Com o ES2015, Math.trunc () está disponível.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Não é suportado no IE11 ou abaixo, mas funciona no Edge e em qualquer outro navegador moderno.

Chad von Nau
fonte
2
Conhece alguma variação que permita truncar até X casas decimais? Seria ingênuo pensar que Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)isso funcionaria?
precisa saber é o seguinte
2
Hey Jamie, parece que isso funcionaria na maioria dos casos, mas é suscetível a pegadinhas de ponto flutuante. por exemplo, value = 2.3e x = 2retornará 2.29. Eu não tenho uma sugestão melhor.
Chad von Nau
Isso para mim parece a resposta certa. Sem arredondamento superior ou inferior. Sem problemas com números negativos. Apenas descarte o decimal. Como a pergunta pedia.
Enrique Moreno Tent
2

Se você não se importa com o roteamento, basta converter o número em uma sequência e remover tudo depois do período, inclusive o período. Isso funciona se existe um decimal ou não.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
Helzgate
fonte
1

O toFixed se comportará como redondo.

Para um comportamento semelhante ao piso, use%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Shahar H
fonte
2
Por que você acha que isso é melhor do que usar o Math.floor? Sua solução parece desnecessariamente complexa e lenta. Não sei como o Math.floor funciona, mas espero que seja muito mais otimizado. Além disso, gostaria de saber se sua solução pode sofrer com erros de arredondamento de ponto flutuante.
Hans Roerdinkholder
1

Aqui está o compressivo na explicação detalhada com a ajuda dos posts acima:

1. Math.trunc (): É usado para remover os dígitos que são seguidos pelo ponto. Ele converte implicitamente. Mas, não suportado no IE.

Exemplo:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

Outra maneira alternativa: Uso do operador bit a bit, não:

Exemplo:

x = 5,5

~~ x // 5

2. Math.floor (): É usado para fornecer o valor inteiro mínimo possível. É suportado em todos os navegadores.

Exemplo:

Math.floor (10.5) // 10

Math.floor (-10.5) // -11

3. Math.ceil (): É usado para fornecer o maior valor inteiro possível. É suportado em todos os navegadores.

Exemplo:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): é arredondado para o número inteiro mais próximo. É suportado em todos os navegadores.

Exemplo:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11

sreepurna
fonte
0

Para uma implementação ES6, use algo como o seguinte:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
Jared
fonte
0

Isto é para aqueles que desejam impedir que os usuários insiram números decimais

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>
Masoud Darvishian
fonte
0

Você pode usar .toFixed (0) para remover a parte decimal completa ou fornecer o número nos argumentos até os quais você deseja que o decimal seja truncado.

Nota: toFixed converterá o número em string.

Nikhil Kamani
fonte
0

Por exemplo:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

ou

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
Kelly K Audrey
fonte