JavaScript converte uma INT grande em notação científica quando o número se torna grande. Como posso impedir que isso aconteça?
javascript
chris
fonte
fonte
translate
transformação que contenha coordenadas em notação científica.Respostas:
Há Number.toFixed , mas ele usa notação científica se o número for> = 1e21 e tiver uma precisão máxima de 20. Fora isso, você pode rolar sozinho, mas será uma bagunça.
Acima usa a repetição de cordas barata e fácil (
(new Array(n+1)).join(str)
). Você pode definir oString.prototype.repeat
uso da multiplicação camponesa russa e usá-la.Esta resposta deve ser aplicada apenas ao contexto da pergunta: exibir um número grande sem usar notação científica. Para qualquer outra coisa, você deve usar uma biblioteca BigInt , como BigNumber , BigInt do Leemon ou BigInteger . No futuro, o novo BigInt nativo (nota: não o Leemon) deve estar disponível; Chromium e navegadores baseados nele ( Chrome , o novo Edge [v79 +], Brave ) e Firefox têm suporte; O suporte do Safari está em andamento.
Veja como você usaria o BigInt para isso:
BigInt(n).toString()
Exemplo:
Mostrar snippet de código
Porém, tenha em atenção que qualquer número inteiro emitido como um número JavaScript (não um BigInt) com mais de 15 a 16 dígitos (especificamente, maior que
Number.MAX_SAFE_INTEGER + 1
[9.007.199.254.740.992]) pode ser arredondado, porque o tipo de número do JavaScript (IEEE-754 de dupla precisão ponto flutuante) não pode conter com precisão todos os números inteiros além desse ponto. ComoNumber.MAX_SAFE_INTEGER + 1
está trabalhando em múltiplos de 2, não pode mais conter números ímpares (e, similarmente, em 18.014.398.509.481.984, ele começa a trabalhar em múltiplos de 4, depois 8 e 16, ...).Conseqüentemente, se você puder contar com o
BigInt
suporte, insira seu número como uma string que você passa para aBigInt
função:Exemplo:
Mostrar snippet de código
fonte
Math.abs
. Obrigado pelo aviso.toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
deve retornar verdadeiro então, mas não ...Eu sei que esta é uma pergunta mais antiga, mas mostra-se ativa recentemente. MDN toLocaleString
você pode usar opções para formatar a saída.
Nota:
Number.toLocaleString () arredonda após 16 casas decimais, para que ...
... retorna ...
586084736227728400000000000000000000000
Talvez isso seja indesejável se a precisão for importante no resultado pretendido.
fonte
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
Para número pequeno e você sabe quantas casas decimais deseja, você pode usar toFixed e, em seguida, usar um regexp para remover os zeros à direita.
fonte
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
mais uma solução possível:
fonte
Number.MAX_SAFE_INTEGER
provavelmente sofrerá esse problema.Aqui está minha pequena variante do
Number.prototype.toFixed
método que funciona com qualquer número:fonte
Number
. Se você converter o primeiro em aNumber
, verá que eles são absolutamente iguais: jsfiddle.net/qd6hpnyx/1 . Você pode retirar seu:P
.0
por uma sequência vazia.console.log(2.2e307.toFixedSpecial(10))
. Quero dizer ... eu recebo vários zeros à direita. Voto positivo de qualquer maneira, porque isso parece mais próximo do que eu preciso.A solução a seguir ignora a formatação exponencial automática para números muito grandes e muito pequenos. Esta é a solução da outis com uma correção de bug : não estava funcionando para números negativos muito pequenos.
fonte
As respostas de outras pessoas não fornecem o número exato!
Esta função calcula o número desejado com precisão e o retorna na string para evitar que seja alterado por javascript!
Se você precisar de um resultado numérico, basta multiplicar o resultado da função no número um!
fonte
Use
.toPrecision
,.toFixed
etc. Você pode contar o número de dígitos no seu número convertendo-o em uma sequência e.toString
depois olhando para ela.length
.fonte
(2e64).toString()
retornará"2e+64"
, então.length
é inútil.Acabei usando isso para pegar o valor de uma entrada, expandindo números abaixo de 17 dígitos e convertendo números exponenciais para x10 y
fonte
Você pode fazer um loop sobre o número e obter o arredondamento
fonte
Eu tentei trabalhar com a forma de string em vez do número e isso parecia funcionar. Eu só testei isso no Chrome, mas deve ser universal:
fonte
Eu acho que pode haver várias respostas semelhantes, mas aqui está uma coisa que eu inventei
Nota: isso é tão preciso quanto as funções matemáticas javascript e tem problemas ao usar log em vez de log10 na linha antes do loop for; ele escreverá 1000 na base 10 como 000, então eu mudei para log10 porque as pessoas geralmente usam a base 10 de qualquer maneira.
Esta pode não ser uma solução muito precisa, mas tenho orgulho em dizer que pode traduzir números com êxito em bases e vem com uma opção de vírgulas!
fonte
Sua pergunta:
Você pode usar isso: https://github.com/MikeMcl/bignumber.js
como isso:
fonte
Sei que muitos anos depois, mas eu estava trabalhando em um problema semelhante recentemente e queria postar minha solução. A resposta atualmente aceita preenche a parte expoente com zeros e a minha tenta encontrar a resposta exata, embora em geral não seja perfeitamente exata para números muito grandes devido ao limite de JS na precisão do ponto flutuante.
Isso funciona
Math.pow(2, 100)
, retornando o valor correto de 1267650600228229401496703205376.fonte
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
com alguns problemas:
fonte
Estourando as expressões regulares. Isso não tem problemas de precisão e não é muito código.
fonte
Se você estiver apenas fazendo isso para exibição, poderá criar uma matriz a partir dos dígitos antes de serem arredondados.
fonte
Atualmente, não há função nativa para dissolver notação científica. No entanto, para esse fim, você deve escrever sua própria funcionalidade.
Aqui está o meu:
fonte
Você pode usar o módulo from-exponential . É leve e totalmente testado.
fonte
Você também pode usar YourJS.fullNumber. Por exemplo,
YourJS.fullNumber(Number.MAX_VALUE)
resulta no seguinte:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Também funciona para números realmente pequenos.
YourJS.fullNumber(Number.MIN_VALUE)
retorna isso:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
É importante notar que esta função sempre retornará números finitos como strings, mas retornará números não-finitos (por exemplo,
NaN
ouInfinity
) comoundefined
.Você pode testá-lo no YourJS Console aqui .
fonte
Você pode usar
number.toString(10.1)
:Nota: atualmente funciona no Chrome, mas não no Firefox. A especificação diz que o radical deve ser um número inteiro, portanto isso resulta em um comportamento não confiável.
fonte
10.1
ou10
nada é equivalente.Eu tive o mesmo problema com o oracle retornando notação científica, mas precisava do número real para um URL. Acabei de usar um truque PHP subtraindo zero e recebo o número correto.
por exemplo 5.4987E7 é o val.
newval agora é igual a 54987000
fonte