Enfrente de Number.toExponential en JS
-
09-10-2019 - |
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.
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