Saltar al contenido

¿Cómo evitar la notación científica para números grandes en JavaScript?

Nuestro grupo de expertos pasados ciertos días de investigación y de recopilar de información, obtuvimos los datos necesarios, nuestro deseo es que te sea útil en tu trabajo.

Solución:

Hay Number.toFixed, pero usa notación científica si el número es> = 1e21 y tiene una precisión máxima de 20. Aparte de eso, puedes lanzar el tuyo propio, pero será complicado.

function toFixed(x) 
  if (Math.abs(x) < 1.0) 
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) 
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    
   else 
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) 
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    
  
  return x;

Los usos anteriores son baratos y fáciles. string repetición ((new Array(n+1)).join(str)). Podrías definir String.prototype.repeat usando la multiplicación campesina rusa y úsala en su lugar.

Esta respuesta solo debe aplicarse al contexto de la pregunta: mostrar un gran número sin usar notación científica. Para cualquier otra cosa, debe usar una biblioteca BigInt, como BigNumber, BigInt de Leemon o BigInteger. En el futuro, el nuevo BigInt nativo (nota: no el de Leemon) debería estar disponible; Chromium y navegadores basados ​​en él (Chrome, el nuevo Edge [v79+], Brave) y Firefox tienen soporte; El apoyo de Safari está en marcha.

Así es como usaría BigInt para ello: BigInt(n).toString()

Ejemplo:

const n = 13523563246234613317632;
console.log("toFixed (wrong): " + n.toFixed());
console.log("BigInt (right):  " + BigInt(n).toString());

Tener cuidado, sin embargo, que cualquier entero que genere como un número de JavaScript (no un BigInt) que tenga más de 15-16 dígitos (específicamente, mayor que Number.MAX_SAFE_INTEGER + 1 [9,007,199,254,740,992]) pueden redondearse, porque el tipo de número de JavaScript (punto flotante de doble precisión IEEE-754) no puede contener con precisión todos los enteros más allá de ese punto. A partir de Number.MAX_SAFE_INTEGER + 1 está funcionando en múltiplos de 2, por lo que ya no puede contener números impares (y de manera similar, en 18,014,398,509,481,984 comienza a funcionar en múltiplos de 4, luego 8, luego 16, …).

En consecuencia, si puede confiar en BigInt soporte, envíe su número como un string pasas al BigInt función:

const n = BigInt("YourNumberHere");

Ejemplo:

const n1 = BigInt(18014398509481985); // WRONG, will round to 18014398509481984
                                      // before `BigInt` sees it
console.log(n1.toString() + " <== WRONG");
const n2 = BigInt("18014398509481985"); // RIGHT, BigInt handles it
console.log(n2.toString() + " <== Right");

Sé que esta es una pregunta anterior, pero se muestra activa recientemente. MDN toLocaleString

const myNumb = 1000000000000000000000;
console.log( myNumb ); // 1e+21
console.log( myNumb.toLocaleString() ); // "1,000,000,000,000,000,000,000"
console.log( myNumb.toLocaleString('fullwide', useGrouping:false) ); // "1000000000000000000000"

puede utilizar opciones para formatear la salida.

Nota:

Number.toLocaleString () se redondea después de 16 lugares decimales, de modo que ...

const myNumb = 586084736227728377283728272309128120398;
console.log( myNumb.toLocaleString('fullwide',  useGrouping: false ) );

...devoluciones...

586084736227728400000000000000000000000

Quizás esto no sea deseable si la precisión es importante en el resultado deseado.

Para números pequeños, y sabe cuántos decimales desea, puede usar toFixed y luego usar una expresión regular para eliminar los ceros finales.

Number(1e-7).toFixed(8).replace(/.?0+$/,"") //0.000

Recuerda que puedes recomendar esta noticia si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *