JavaScript convierte un gran INT a notación científica cuando el número se vuelve grande. ¿Cómo puedo evitar que esto suceda?
javascript
Chris
fuente
fuente
translate
transformación que contenga coordenadas en notación científica.Respuestas:
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 rodar el tuyo, pero será complicado.
El anterior utiliza la repetición de cadenas cheap-'n'-easy (
(new Array(n+1)).join(str)
). Puede definir elString.prototype.repeat
uso de la multiplicación campesina rusa y utilizarlo 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 , Leemon's BigInt o BigInteger . En el futuro, el nuevo BigInt nativo (nota: no Leemon's) debería estar disponible; Chromium y los 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ías BigInt para ello:
BigInt(n).toString()
Ejemplo:
Mostrar fragmento de código
Sin embargo, tenga en cuenta que cualquier número entero que ingrese 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]) puede redondearse, porque el tipo de número de JavaScript (IEEE-754 de doble precisión punto flotante) no puede contener con precisión todos los enteros más allá de ese punto. A partir deNumber.MAX_SAFE_INTEGER + 1
que funciona en múltiplos de 2, por lo que ya no puede contener números impares (y de manera similar, a 18,014,398,509,481,984 comienza a funcionar en múltiplos de 4, luego 8, luego 16, ...).En consecuencia, si puede confiar en el
BigInt
soporte, envíe su número como una cadena que pase a laBigInt
función:Ejemplo:
Mostrar fragmento de código
fuente
Math.abs
. Gracias por el aviso.toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
debe devolver cierto entonces, pero no es así ...Sé que esta es una pregunta anterior, pero se muestra recientemente activa. MDN toLocaleString
puede usar opciones para formatear la salida.
Nota:
Number.toLocaleString () se redondea después de 16 decimales, de modo que ...
...devoluciones...
586084736227728400000000000000000000000
Esto quizás no sea deseable si la precisión es importante en el resultado deseado.
fuente
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
Para un número pequeño, y sabe cuántos decimales desea, puede usar toFixed y luego usar una expresión regular para eliminar los ceros finales.
fuente
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
Una posible solución más:
fuente
Number.MAX_SAFE_INTEGER
es probable que sufra este problema.Aquí está mi pequeña variante de
Number.prototype.toFixed
método que funciona con cualquier número:fuente
Number
. Si lanza el primero a unNumber
, verá que son absolutamente iguales: jsfiddle.net/qd6hpnyx/1 . Puede retirar su:P
.0
con una cadena vacía.console.log(2.2e307.toFixedSpecial(10))
. Quiero decir ... obtengo varios ceros al final. Votar de todos modos porque esto parece más cercano a lo que necesito.La siguiente solución omite el formato exponencial automático para números muy grandes y muy pequeños. Esta es la solución de outis con una corrección de errores : no funcionaba para números negativos muy pequeños.
fuente
¡Las respuestas de los demás no te dan el número exacto!
¡Esta función calcula el número deseado con precisión y lo devuelve en la cadena para evitar que JavaScript lo cambie!
Si necesita un resultado numérico, ¡simplemente multiplique el resultado de la función en el número uno!
fuente
Uso
.toPrecision
,.toFixed
etc. Puede contar el número de dígitos en su número al convertirlo en una cadena y.toString
luego mirarlo.length
.fuente
(2e64).toString()
volverá"2e+64"
, por lo que.length
es inútil.Esto es lo que terminé usando para tomar el valor de una entrada, expandiendo números de menos de 17 dígitos y convirtiendo números exponenciales a x10 y
fuente
Puede recorrer el número y lograr el redondeo
fuente
Traté de trabajar con la forma de cadena en lugar del número y esto pareció funcionar. Solo he probado esto en Chrome, pero debería ser universal:
fuente
Creo que puede haber varias respuestas similares, pero aquí hay algo que se me ocurrió
Nota: esto es tan preciso como las funciones matemáticas de JavaScript y tiene problemas al usar log en lugar de log10 en la línea anterior al ciclo for; escribirá 1000 en base-10 como 000, así que lo cambié a log10 porque la gente usará la base-10 de todos modos.
Puede que esta no sea una solución muy precisa, pero me enorgullece decir que puede traducir con éxito números a través de bases y que viene con una opción para comas.
fuente
Tu pregunta:
Puede usar esto: https://github.com/MikeMcl/bignumber.js
Me gusta esto:
fuente
Sé que han pasado muchos años, pero recientemente había estado trabajando en un problema similar y quería publicar mi solución. La respuesta actualmente aceptada rellena la parte del exponente con 0, y la mía intenta encontrar la respuesta exacta, aunque en general no es perfectamente precisa para números muy grandes debido al límite de JS en la precisión de coma flotante.
Esto funciona para
Math.pow(2, 100)
, devolviendo el valor correcto de 1267650600228229401496703205376.fuente
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
con algunos problemas:
fuente
Destrozando las expresiones regulares. Esto no tiene problemas de precisión y no es mucho código.
fuente
Si solo lo está haciendo para mostrar, puede construir una matriz a partir de los dígitos antes de que se redondeen.
fuente
Actualmente no existe una función nativa para disolver la notación científica. Sin embargo, para este propósito debe escribir su propia funcionalidad.
Aquí está mi:
fuente
Puede usar el módulo exponencial from . Es ligero y totalmente probado.
fuente
También puede usar YourJS.fullNumber. Por ejemplo,
YourJS.fullNumber(Number.MAX_VALUE)
resulta en lo siguiente:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
También funciona para números realmente pequeños.
YourJS.fullNumber(Number.MIN_VALUE)
devuelve esto:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
Es importante tener en cuenta que esta función siempre devolverá números finitos como cadenas pero devolverá números no finitos (por ejemplo,
NaN
oInfinity
) comoundefined
.Puede probarlo en la consola YourJS aquí .
fuente
Puedes usar
number.toString(10.1)
:Nota: actualmente funciona en Chrome, pero no en Firefox. La especificación dice que la raíz tiene que ser un número entero, por lo que esto resulta en un comportamiento poco confiable.
fuente
10.1
o10
o nada son equivalentes.Tuve el mismo problema con la devolución de la notación científica de Oracle, pero necesitaba el número real para una url. Acabo de usar un truco PHP restando cero, y obtengo el número correcto.
por ejemplo 5.4987E7 es el val.
newval ahora es igual a 54987000
fuente