Opposto di Number.toExponential in JS
-
09-10-2019 - |
Domanda
Ho bisogno di ottenere il valore di un numero estremamente grande in JavaScript in forma non esponenziale. Number.toFixed
semplicemente lo restituisce in forma esponenziale come una stringa, che è peggio di quello che avevo.
Questo è quello che ritorna Number.toFixed
:
>>> x = 1e+31
1e+31
>>> x.toFixed()
"1e+31"
Number.toPrecision
non lo fa anche il lavoro:
>>> x = 1e+31
1e+31
>>> x.toPrecision( 21 )
"9.99999999999999963590e+30"
Quello che vorrei è:
>>> x = 1e+31
1e+31
>>> x.toNotExponential()
"10000000000000000000000000000000"
ho potuto scrivere il mio parser, ma avrei preferito utilizzare un metodo JS nativo se ne esiste uno.
Soluzione
La risposta è che non c'è nessuna tale funzione built-in. Ho cercato di alta e bassa. Ecco l'utilizzo RegExp I dividere il numero nel segno, coefficiente (cifre prima della virgola), parte frazionaria (cifre dopo punto decimale) ed esponente:
/^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/
"roll your own" è la risposta, che hai già fatto.
Altri suggerimenti
È possibile utilizzare toPrecision
con un parametro che specifica il numero di cifre che si desidera visualizzare:
x.toPrecision(31)
Tuttavia, tra i browser che ho provato, il codice precedente funziona solo su Firefox. In base alle specifiche ECMAScript, l'intervallo valido per toPrecision
è di 1 a 21, ed entrambi IE e Chrome gettare un RangeError
conseguenza. Ciò è dovuto al fatto che la rappresentazione a virgola mobile utilizzato in JavaScript è incapace di realtà rappresentare numeri a 31 cifre di precisione.
Usa numero (stringa)
Esempio:
var a=Number("1.1e+2");
dà un = 110
E 'possibile accrescere la produzione esponenziale di JavaScript utilizzando le funzioni di stringa. Certo, quello che mi è venuta è un po 'criptico, ma funziona se l'esponente dopo la e
è positivo:
var originalNumber = 1e+31;
var splitNumber = originalNumber.toString().split('e');
var result;
if(splitNumber[1]) {
var regexMatch = splitNumber[0].match(/^([^.]+)\.?(.*)$/);
result =
/* integer part */ regexMatch[1] +
/* fractional part */ regexMatch[2] +
/* trailing zeros */ Array(splitNumber[1] - regexMatch[2].length + 1).join('0');
} else result = splitNumber[0];
"10000000000000000000000000000000"?
Difficile credere che qualcuno avrebbe preferito guardare quel che 1.0E + 31,
o in html: 10 31 . Ma qui è un modo, gran parte di essa è per esponenti negativi (frazioni):
function longnumberstring(n){
var str, str2= '', data= n.toExponential().replace('.','').split(/e/i);
str= data[0], mag= Number(data[1]);
if(mag>=0 && str.length> mag){
mag+=1;
return str.substring(0, mag)+'.'+str.substring(mag);
}
if(mag<0){
while(++mag) str2+= '0';
return '0.'+str2+str;
}
mag= (mag-str.length)+1;
while(mag> str2.length){
str2+= '0';
}
return str+str2;
}
input: 1e+30
longnumberstring: 1000000000000000000000000000000
to Number: 1e+30
input: 1.456789123456e-30
longnumberstring: 0.000000000000000000000000000001456789123456
to Number: 1.456789123456e-30
input: 1.456789123456e+30
longnumberstring: 1456789123456000000000000000000
to Number: 1.456789123456e+30
input: 1e+80 longnumberstring: 100000000000000000000000000000000000000000000000000000000000000000000000000000000
to Number: 1e+80