Como descobrir que um número é float
ou integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
fonte
fonte
<nit-pick>
JavaScript não possui diferentes tipos numéricos e números flutuantes. Todo número em JavaScript é apenas umNumber
.</nit-pick>
Infinity
um valor inteiro ou não inteiro para você? As respostas aqui são bem distribuídas nessa pontuação.Infinity
não pode ser considerado um número inteiro.Respostas:
verifique o restante ao dividir por 1:
Se você não souber que o argumento é um número, precisará de dois testes:
Atualização 2019 5 anos após a redação desta resposta, uma solução foi padronizada no ECMA Script 2015. Essa solução é abordada nesta resposta .
fonte
true
,false
,null
, um array vazio, um array contendo um único número inteiro, um array contendo uma cadeia que representa um número inteiro, e talvez mais.""
e1.0
isInt("");
&&isInt(1.0);
resultam emtrue
esta demo jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, será "simplesmente errado" ou "Pior resposta no SO" porque não verifica se o argumento é uma matriz primeiro? Sim, boa prática para verificar argumentos, mas isso é responsabilidade do desenvolvedor. As respostas do SO devem ser curtas e responder diretamente à pergunta o mais claramente possível.Tente estas funções para testar se um valor é um valor primitivo numérico que não possui parte fracionária e está dentro dos limites de tamanho do que pode ser representado como um número inteiro exato.
fonte
n===+n
para verificar numérico,n|0
arredondar), mas com operadores internos. funkyparseFloat()
primeiro.|
(OR) operam apenas em números inteiros de 32 bits assinados. O OP não indica se o objetivo é verificar valores int32 assinados. Portanto, isso não funcionará com números fora do intervalo.isInteger(5000000000)
retornará ofalse
que está errado!Por que não algo assim:
fonte
n
é convertido em uma string porparseInt
. Veja MDN . Mas vou usar esta solução. :)Existe um método chamado
Number.isInteger()
que atualmente é implementado em tudo, menos no IE. O MDN também fornece um polyfill para outros navegadores:No entanto, para a maioria dos casos de uso, é melhor usar o
Number.isSafeInteger
que também verifica se o valor é tão alto / baixo que qualquer casa decimal seria perdida de qualquer maneira. A MDN também possui um polilato. (Você também precisa doisInteger
preenchimento de polly acima.)fonte
12.0 ∈ ℤ
.Number.isInteger
. É, no entanto, um polyfill correto paraNumber.isSafeInteger
.Number.isInteger
não deve verificar se o número é um "número inteiro seguro". Veja no MDN: isInteger e isSafeInteger .Você pode usar uma expressão regular simples:
Ou você também pode usar as funções abaixo, de acordo com suas necessidades. Eles são desenvolvidos pelo projeto PHPJS .
is_int()
=> Verifique se o tipo de variável é inteiro e se seu conteúdo é inteirois_float()
=> Verifique se o tipo de variável é flutuante e se seu conteúdo é flutuantectype_digit()
=> Verifique se o tipo de variável é string e se seu conteúdo possui apenas dígitos decimaisAtualização 1
Agora também verifica números negativos, obrigado pelo comentário do @ChrisBartley !
fonte
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Aqui estão funções eficientes que verificam se o valor é um número ou pode ser convertido com segurança em um número:
E para números inteiros (retornaria false se o valor for um valor flutuante):
A eficiência aqui é que parseInt (ou parseNumber) é evitado quando o valor já é um número. As duas funções de análise sempre convertem primeiro em string e, em seguida, tentam analisar essa string, o que seria um desperdício se o valor já fosse um número.
Obrigado às outras postagens aqui por fornecer mais idéias para otimização!
fonte
fonte
1.2
. Sempre teste funções numéricas com 0,1 0,2 0,3funciona para todos os casos.
fonte
isInt('1')
retornatrue
como esperado (pelo menos para mim). Bastante estranho, porém, este retornatrue
aoisInt([5])
bem. Não importa para mim, mas pode para você, então, tome cuidado.Como outros mencionados, você só tem duplas em JS. Então, como você define um número como um número inteiro? Basta verificar se o número arredondado é igual a si mesmo:
fonte
isFloat('abc')
retornostrue
isFloat(NaN) // true
Que tal este?
fonte
console.log(isFloat(1.0));
resultados falsos.Aqui está o que eu uso para números inteiros:
Curto, legal :) Funciona o tempo todo. É o que David Flanagan sugere se não me engano.
fonte
parseFloat
?Realmente depende do que você deseja alcançar. Se você deseja "emular" idiomas fortemente tipados, sugiro que você não tente. Como outros mencionados, todos os números têm a mesma representação (o mesmo tipo).
Usando algo como Claudiu forneceu:
isInteger( 1.0 )
-> verdadeiroo que parece bom para o senso comum, mas em algo como C você obteria
false
fonte
Qualquer número flutuante com uma parte decimal zero (por exemplo, 1,0, 12,00, 0,0) é convertido implicitamente em Inteiro, portanto, não é possível verificar se eles são flutuantes ou não.
fonte
fonte
!!(24.0%1)
é falsoRealmente não precisa ser tão complicado. O valor numérico dos equivalentes parseFloat () e parseInt () de um número inteiro será o mesmo. Assim, você pode fazer o seguinte:
Então
Isso também permitirá verificações de string e, portanto, não é rigoroso. Se quiser uma solução de tipo forte (ou seja, não funcionará com strings):
fonte
Não houve um caso em que isso não funcionou.
fonte
2
é um número inteiro e23
é considerado um segundo argumento para a função. Em javascript, os decimais são escritos usando ponto como separador - assim deve ser2.23
.ESTE É O CÓDIGO FINAL PARA VERIFICAR INT E FLUTUAR
OU
fonte
fonte
É simples como:
Tente isso no console:
Isso confunde muita gente. Sempre que algo é 0,0, não é mais um carro alegórico. É um número inteiro. Ou você pode simplesmente chamá-lo de "coisa numérica", pois não há distinção estrita como na época em C. Bons velhos tempos.
Então, basicamente, tudo o que você pode fazer é verificar se o número inteiro aceita o fato de que 1.000 é um número inteiro.
Nota lateral interessante
Houve um comentário sobre grandes números. Números enormes não significam problema para essa abordagem; sempre que parseInt for incapaz de manipular o número (por ser muito grande), ele retornará algo além do valor real; portanto, o teste retornará FALSE. Isso é bom porque se você considera algo um "número", normalmente espera que o JS possa calcular com ele - então sim, os números são limitados e o parseInt levará isso em consideração , para colocar dessa maneira.
Tente o seguinte:
No meu navegador (IE8), isso retorna "a está ok; b falha", o que é exatamente por causa do grande número em b. O limite pode variar, mas acho que 20 dígitos "devem ser suficientes para qualquer um", para citar um clássico :)
fonte
Number.isInteger
.Number.isInteger
funciona. Um teste de linha única én === (n | 0)
como mostrado em outra resposta.Esta solução funcionou para mim.
fonte
Para números inteiros eu uso isso
fonte
No script java, todos os números são
internally 64 bit floating point
iguais ao dobro do java. Não há tipos diferentes em javascript, todos são representados por tiponumber
. Portanto, você não poderá fazer umainstanceof
verificação. No entanto, você pode usar as soluções acima fornecidas para descobrir se é um número fracionário. Os designers de scripts java sentiram com um único tipo que podem evitar inúmeros erros de conversão de tipos.fonte
Algumas vezes, os objetos Number não permitem o uso direto do operador mod (%); se você estiver enfrentando esse caso, poderá usar esta solução.
fonte
Tentando algumas das respostas aqui, acabei escrevendo esta solução. Isso funciona também com números dentro de uma string.
fonte
Talvez isso não seja tão eficiente quanto a resposta%, o que impede que você precise converter para uma string primeiro, mas ainda não vi ninguém postá-la, então aqui está outra opção que deve funcionar bem:
fonte
Para os curiosos, usando o Benchmark.js, testei as respostas mais votadas (e as postadas hoje) nesta publicação, eis os meus resultados:
fonte
Aqui está o meu código. Ele verifica se não é uma sequência vazia (que de outra forma passará) e depois a converte para o formato numérico. Agora, dependendo de você querer que '1.1' seja igual a 1.1, isso pode ou não ser o que você está procurando.
fonte
Eu gosto dessa pequena função, que retornará true para números inteiros positivos e negativos:
Isso funciona porque 1 ou "1" se torna "1.0", que éNaN () retorna falso em (que então negamos e retornamos), mas 1.0 ou "1.0" se torna "1.0.0", enquanto "string" se torna "string". 0 ", nenhum dos quais são números, então isNaN () retorna falso (e, novamente, é negado).
Se você deseja apenas números inteiros positivos, existe esta variante:
ou, para números inteiros negativos:
isPositiveInt () funciona movendo a seqüência numérica concatenada à frente do valor a ser testado. Por exemplo, isPositiveInt (1) resulta em isNaN () avaliando "01", que avalia falso. Enquanto isso, isPositiveInt (-1) resulta em isNaN () avaliando "0-1", que avalia true. Negamos o valor de retorno e isso nos dá o que queremos. isNegativeInt () funciona de maneira semelhante, mas sem negar o valor de retorno de isNaN ().
Editar:
Minha implementação original também retornaria true em matrizes e seqüências de caracteres vazias. Esta implementação não possui esse defeito. Ele também tem o benefício de retornar mais cedo se val não for uma sequência ou número ou se for uma sequência vazia, tornando-o mais rápido nesses casos. Você pode modificá-lo ainda mais, substituindo as duas primeiras cláusulas por
se você quiser apenas combinar números literais (e não cadeias)
Editar:
Ainda não posso postar comentários, então estou adicionando isso à minha resposta. A referência postada por @Asok é muito informativa; no entanto, a função mais rápida não se encaixa nos requisitos, pois também retorna TRUE para flutuadores, matrizes, booleanos e cadeias vazias.
Criei o seguinte conjunto de testes para testar cada uma das funções, adicionando também minha resposta à lista (função 8, que analisa seqüências de caracteres, e função 9, que não):
Também refiz a referência com a função # 8 adicionada à lista. Não publicarei o resultado, pois eles são um pouco embaraçosos (por exemplo, essa função NÃO é rápida) ...
Os resultados (resumidos - removi testes bem-sucedidos, pois a saída é bastante longa) são os seguintes:
Eu deixei falhas para que você possa ver onde cada função está falhando, e o (string) '#' testa para que você possa ver como cada função lida com valores inteiros e flutuantes em strings, pois alguns podem querer que eles sejam analisados como números e alguns não deve.
Das 10 funções testadas, as que realmente atendem aos requisitos do OP são [1,3,5,6,8,9]
fonte
Condição para validação flutuante:
Condição para validação de número inteiro:
Espero que isso possa ser útil.
fonte
Você pode adicionar
typeof a === 'number'
se desejar excluir cadeias de caracteres.fonte