Eu tenho números flutuantes como 3.2
e 1.6
.
Preciso separar o número na parte inteira e decimal. Por exemplo, um valor de 3.2
seria dividido em dois números, ie 3
e0.2
Obter a parte inteira é fácil:
n = Math.floor(n);
Mas estou tendo problemas para obter a parte decimal. Eu tentei isso:
remainer = n % 2; //obtem a parte decimal do rating
Mas nem sempre funciona corretamente.
O código anterior tem a seguinte saída:
n = 3.1 => remainer = 1.1
O que estou perdendo aqui?
n = Math.floor(n);
só é devolver o resultado desejado (a parte inteira) para números não negativos% 1
not% 2
Respostas:
Use
1
, não2
.fonte
Math.*
ou%
operar.toFixed
pode ajudar em algumas situações, por exemplo,(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
Se você precisar dele, sem a0.
2.3
surgiu, e não2
ou3
, o número0.2999999999999998
é perfeitamente aceitável, apesar de parecer ofensivo aos olhos humanos.Embora isso não funcione para números negativos, talvez tenhamos que fazer
fonte
Math.floor()
novamente - basta usar a parte inteira que você calculou.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
use Math.floor () apenas uma vez.integr = 3; decimal = 0.20000000000000018;
Math.floor
comMath.trunc
.Você pode converter para string, certo?
fonte
n.toString()
vez den + ""
ser mais legível.n + ""
é realmente melhor (ver jsperf.com/number-vs-number-tostring-vs-string-number ).
como um separador decimal, assim você estará bem em qualquer lugar se o tipo da sua variável de entrada for flutuante. Você só precisa lidar com esse problema se sua entrada for string. Eu também tenho que observar que esta resposta retorna uma string em uma matriz. Uma solução mais completa éparseFloat('0.' + (n + '').split('.')[1])
Como 0.2999999999999998 é uma resposta aceitável? Se eu fosse o autor da pergunta, gostaria de receber uma resposta de 0,3. O que temos aqui é precisão falsa, e meus experimentos com floor,%, etc indicam que o Javascript gosta de precisão falsa para essas operações. Então, acho que as respostas que estão usando a conversão para string estão no caminho certo.
Eu faria isso:
Especificamente, eu estava usando 100233.1 e queria a resposta ".1".
fonte
.toString()
não considera i18n. O separador decimal será sempre de.
acordo com o MDN e as especificações da ECMAAqui está como eu faço, que eu acho que é a maneira mais direta de fazê-lo:
fonte
Uma maneira simples de fazer isso é:
Infelizmente, isso não retorna o valor exato. No entanto, isso é facilmente corrigido:
Você pode usar isso se não souber o número de casas decimais:
fonte
Maneira independente da língua:
observe que ele corrige apenas números com um comprimento fraturaanal)
fonte
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Você pode usar a
parseInt()
função para obter a parte inteira do que a extrair a parte decimalOu você pode usar regex como:
fonte
0.20000000000000018
... isso é realmente ficando difícil de fazer porque0.2 < 0.20000000000000018
retorna true .. 3.2 deve retornar 0,2: P fazendo tantas irregularidades e usando.toFixed(2)
retornos string: PO seguinte funciona, independentemente das configurações regionais do separador decimal ... na condição de apenas um caractere ser usado para um separador.
Não é bonito, mas é preciso.
fonte
Se a precisão for importante e você precisar de resultados consistentes, aqui estão algumas proposições que retornarão a parte decimal de qualquer número como uma string, incluindo o "0" inicial. Se você precisar dele como flutuador, basta adicionar
var f = parseFloat( result )
no final.Se a parte decimal for igual a zero, "0,0" será retornado. Nulo, NaN e números indefinidos não são testados.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Aqui está um link jsPerf: https://jsperf.com/decpart-of-number/
Podemos ver que a proposição nº 2 é a mais rápida.
fonte
Você pode convertê-lo em uma sequência e usar o
replace
método para substituir a parte inteira por zero, depois converter o resultado novamente em um número:fonte
/^[^,]/
), mas deve deixar o resultado como uma string (remover o+
operador) para evitarNaN
resultados.Dependendo do uso que você fornecerá posteriormente, mas esta solução simples também poderá ajudá-lo.
Não estou dizendo que é uma boa solução, mas para alguns casos concretos funciona
Mas levará mais tempo do que a solução proposta por @Brian M. Hunt
fonte
Eu tive um caso em que sabia que todos os números em questão teriam apenas um decimal e queria obter a parte decimal como um número inteiro, então acabei usando esse tipo de abordagem:
Isso funciona bem também com números inteiros, retornando 0 nesses casos.
fonte
Estou usando:
Entrada: -556.123444444
Resultado: 123444444
fonte
As funções matemáticas são mais rápidas, mas sempre retornam valores não nativos esperados. A maneira mais fácil que encontrei é
fonte
Uma boa opção é transformar o número em uma string e depois dividi-lo.
Em uma linha de código
fonte
Depois de analisar várias delas, agora estou usando ...
fonte
fonte
Embora eu esteja muito atrasado para responder, dê uma olhada no código.
fonte
O sinal decimal em ponto flutuante e o formato numérico podem depender do país (
.,
); portanto, a solução independente, que preservou a parte do ponto flutuante, é:- é uma solução internacionalizada, em vez de depender da localização:
Descrição da solução passo a passo:
parseFloat()
para garantir a criptografia de entradaMath.abs()
para evitar problemas com números negativosn = parseInt(x)
para obter parte decimalx - n
para subtrair parte decimaltoFixed()
com a contagem de dígitos na parte flutuante do número flutuante originalx
. A contagem é calculada como a diferença entre o comprimento do número originalx
e o númeron
em sua representação de sequência.fonte
Use este:
A
Math.frac
função aqui tem 3 modos:É simples :)
fonte
fonte