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.