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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top