ti-enxame.com

Convertendo um duplo para um int em Javascript sem arredondamento

Em C #, o código a seguir retorna 2:

double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);

No Javascript, no entanto, a única maneira de converter um "double" para um "int" que eu conheço é usando Math.round/floor/toFixed etc. Existe uma maneira de converter para um int em Javascript sem arredondamento ? Estou ciente das implicações de desempenho de Number (), então eu prefiro evitar convertê-lo em uma string, se possível.

47
RSH1

Use parseInt().

var num = 2.9
console.log(parseInt(num, 10)); // 2

Você também pode usar |.

var num = 2.9
console.log(num | 0); // 2
115
kubetz

Acho as sugestões "parseInt" muito curiosas, porque "parseInt" opera em strings por design. É por isso que seu nome tem a palavra "parse" nele.

Um truque que evita uma chamada de função é inteiramente

var truncated = ~~number;

A dupla aplicação do operador "~" unário deixará você com uma versão truncada de um valor de precisão dupla. No entanto, o valor é limitado à precisão de 32 bits, como acontece com todas as outras operações de JavaScript que implicitamente envolvem a consideração de números como inteiros (como a indexação de matrizes e os operadores bit a bit).

edit - Em uma atualização bem depois, outra alternativa para o truque ~~ é bitwise-OR o valor com zero:

var truncated = number|0;
47
Pointy

Apenas use parseInt() e certifique-se de incluir a raiz para obter resultados previsíveis:

parseInt(d, 10);
7
Justin Niessner

Não existe uma int em Javascript. Todas Numbers são na verdade dobra nos bastidores *, então você não pode confiar no sistema de tipos para emitir uma ordem de arredondamento para você, como em C ou C #.

Você não precisa se preocupar com problemas de precisão (já que as duplas representam corretamente qualquer número inteiro até 2 ^ 53), mas você realmente fica com o Math.floor (ou outros truques equivalentes) se quiser arredondar para o inteiro mais próximo.


* A maioria dos mecanismos JS usa ints nativos quando podem, mas todos os números JS ainda devem ter semântica dupla.

5
hugomg

Semelhante ao C # casting para (int) usando apenas o padrão lib:

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
1
Roland

Como @Quentin e @Pointy apontaram em seus comentários, não é uma boa idéia usar parseInt() porque ele foi projetado para converter uma string em um inteiro. Quando você passa um número decimal para ele, ele primeiro converte o número em uma string e o lança para um inteiro. Sugiro que você use Math.trunc(), Math.floor(), ~~num, ~~v, num | 0, num << 0 ou num >> 0 dependendo de suas necessidades. Este teste de desempenho demonstra a diferença no desempenho parseInt() e Math.floor(). , este post explica a diferença entre os métodos propostos.

0
1man