Pregunta

necesito para obtener el valor de un número extremadamente grande en JavaScript en forma no exponencial. Number.toFixed simplemente lo devuelve en forma exponencial como una cadena, que es peor que lo que tenía.

Esto es lo que vuelve Number.toFixed:

>>> x = 1e+31
1e+31
>>> x.toFixed()
"1e+31"

Number.toPrecision tampoco funciona:

>>> x = 1e+31
1e+31
>>> x.toPrecision( 21 )
"9.99999999999999963590e+30"

Lo que me gustaría es:

>>> x = 1e+31
1e+31
>>> x.toNotExponential()
"10000000000000000000000000000000"

Podría escribir mi propio analizador pero preferiría utilizar un método de JS nativo si es que existe.

¿Fue útil?

Solución

La respuesta es que no hay tal función incorporada. He buscado alta y baja. Aquí está el uso RegExp que dividir el número en la muestra, el coeficiente (dígitos antes del punto decimal), parte fraccionaria (dígitos después del punto decimal) y el exponente:

/^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/

"Cómo crear sus propios" es la respuesta, que ya lo hizo.

Otros consejos

Se puede usar toPrecision con un parámetro que especifica el número de dígitos que desea visualizar:

x.toPrecision(31)

Sin embargo, entre los navegadores que he probado, el código anterior sólo funciona en Firefox. Según la especificación ECMAScript, el rango válido para toPrecision es de 1 a 21, y ambos IE y Chrome lanzar una RangeError en consecuencia. Esto es debido al hecho de que la representación de coma flotante utilizado en JavaScript es incapaz de representar los números en realidad a 31 dígitos de precisión.

Utilizar número (cadena)

Ejemplo: var a=Number("1.1e+2"); da a = 110

Es posible ampliar la producción exponencial de JavaScript usando funciones de cadena. Es cierto que lo que me ocurrió es algo críptica, pero funciona si el exponente después de la e es 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"?

Hard to believe that anybody would rather look at that than 1.0e+31,

or in html: 1031. But here's one way, much of it is for negative exponents(fractions):

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top