Gostaria de converter um número flutuante em um número inteiro em JavaScript. Na verdade, eu gostaria de saber como fazer AMBAS as conversões padrão: truncando e arredondando. E de forma eficiente, não através da conversão para uma string e análise.
javascript
syntax
mcherm
fonte
fonte
Respostas:
Referência de objeto matemático
Exemplos
Positivo Negativo Positivo - números maiores Negativo - números maioresfonte
var intValue = ~~floatValue;
. Se a notação é demasiado obscuro para o seu gosto, apenas escondê-lo em uma função:function toInt(value) { return ~~value; }
. (Isso também converte seqüências de caracteres em números inteiros, se você quiser fazê-lo.) #Math.trunc(val);
Comentário porque esta é a resposta aceita2.3 - 2.3 % 1
Operador OR bit a bit
Um bit a bit ou operador pode ser usado para truncar figuras de ponto flutuante e funciona para positivos e negativos:
Resultados
Comparação de desempenho?
Eu criei um teste JSPerf que compara o desempenho entre:
Math.floor(val)
val | 0
OR bit a bit~~val
NÃO bit a bitparseInt(val)
isso funciona apenas com números positivos. Nesse caso, é seguro usar operações bit a bit e
Math.floor
funções.Mas se você precisar que seu código funcione com positivos e negativos , uma operação bit a bit é a mais rápida (OU é a preferida). Esse outro teste JSPerf compara o mesmo, onde é bastante óbvio que, devido à verificação adicional de sinais, o Math agora é o mais lento dos quatro.
Nota
Conforme declarado nos comentários, os operadores BITWISE operam em números inteiros de 32 bits assinados; portanto, grandes números serão convertidos, por exemplo:
fonte
Math.floor()
é mais rápido (pelo menos de acordo com a execução do seu primeiro teste JSPerf no Google Chrome, versão 30.0.1599.101), mais robusto (porque não depende de como os números são representados em bits, que pode mudar e possivelmente quebrar essa solução bit a bit) e, mais importante, mais explícita.~~
é melhor porque é um operador unário.4.2|0+4
igual4
mas~~4.2+4
igual8
Nota: Você não pode usar
Math.floor()
como um substituto para truncar, porqueMath.floor(-3.1) = -4
e não-3
!!Uma substituição correta para truncar seria:
fonte
Math.trunc(value)
foi adicionado no ECMAScript 6floor
arredonda para -in infinito,truncate
arredonda para zero. (ceil
arredonda para + infinito).Um operador não bit a bit duplo pode ser usado para truncar flutuadores. As outras operações que você mencionou estão disponíveis através de
Math.floor
,Math.ceil
eMath.round
.Mais detalhes cortesia de James Padolsey.
fonte
<canvas>
mecanismo de renderização de fontes em JS . Obrigado!Para truncar:
Para rodada:
fonte
Você pode usar o método parseInt para não arredondar. Tenha cuidado com a entrada do usuário devido às opções de prefixo 0x (hex) e 0 (octal).
fonte
parseInt(1000000000000000000000, 10);
resulta em 1, não em 1 000 000 000 000 000 000 000 000. De qualquer forma, a pergunta explicitamente não queria " converter para uma string e analisar ", embora isso seja relativamente menor ...;)parseInt()
espera que uma string não seja um número como seu primeiro parâmetro. Quando você passar este número inteiro, ele é convertido para1e21
e, em seguida,parseInt
analisa a cadeia1e21
, o que resulta em1
.Deslocamento de bits por 0, o que equivale à divisão por 1
fonte
>> 0
parece funcionar apenas para números inteiros < 2 ^ 31-1 e>>> 0
para números inteiros < 2 ^ 32-1 . Isso retorna 0 para valores maioresNo seu caso, quando você deseja uma sequência no final (para inserir vírgulas), também pode usar a
Number.toFixed()
função, no entanto, isso fará o arredondamento.fonte
Há muitas sugestões aqui. O OR bit a bit parece ser o mais simples de longe. Aqui está outra solução curta que funciona com números negativos, também usando o operador de módulo. Provavelmente é mais fácil entender do que o OR bit a bit:
Este método também funciona com números de alto valor, onde nem '| 0' nem '~~' nem '>> 0' funcionam corretamente:
fonte
Para truncar :
Para arredondar :
fonte
Mais uma maneira possível - use a operação XOR:
A prioridade das operações bit a bit é menor que a prioridade das operações matemáticas, é útil. Experimente em https://jsfiddle.net/au51uj3r/
fonte
Se olhar para um
Math
objeto nativo em JavaScript, você obtém todo o conjunto de funções para trabalhar com números e valores, etc ...Basicamente, o que você quer fazer é bastante simples e nativo em JavaScript ...
Imagine que você tem o número abaixo:
e agora, se você quiser arredondá-lo para o número mais próximo, basta:
e você obtém:
Se você quiser arredondar para o número mais próximo, faça o seguinte:
e você obtém:
Também
Math.round
apenas arredondá-lo para um número maior ou menor depende de qual deles está mais próximo do número do flot.Também é possível usar
~~
atrás do número do flutuador, que converterá um flutuador em um número inteiro.Você pode usá-lo como
~~myValue
...fonte
~~
porque, se o número for maior que o limite int 32, ele mudará o valor para o valor limite int 32.fonte
Eu só quero ressaltar que monetariamente você deseja arredondar, e não truncar. É muito menos provável que você gaste um centavo, pois 4.999452 * 100 arredondado fornecerá 5, uma resposta mais representativa.
Além disso, não se esqueça do arredondamento dos banqueiros , que é uma maneira de combater o viés levemente positivo que o arredondamento direto oferece - seu aplicativo financeiro pode exigir isso.
Arredondamento de gaussiano / banqueiro em JavaScript
fonte
Se você estiver usando angularjs, a solução simples é a seguinte: Em Ligação de modelo HTML
{{val | number:0}}
ele converterá val em inteiro
siga este link docs.angularjs.org/api/ng/filter/number
fonte