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

translatetransformació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.repeatuso 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 + 1que 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
BigIntsoporte, envíe su número como una cadena que pase a laBigIntfunción:Ejemplo:
Mostrar fragmento de código
fuente
Math.abs. Gracias por el aviso.toFixed(Number.MAX_VALUE) == Number.MAX_VALUEdebe 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...
586084736227728400000000000000000000000Esto 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 1000Una posible solución más:
fuente
Number.MAX_SAFE_INTEGERes probable que sufra este problema.Aquí está mi pequeña variante de
Number.prototype.toFixedmé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.0con 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,.toFixedetc. Puede contar el número de dígitos en su número al convertirlo en una cadena y.toStringluego mirarlo.length.fuente
(2e64).toString()volverá"2e+64", por lo que.lengthes 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_VALUEcon 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:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000También funciona para números realmente pequeños.
YourJS.fullNumber(Number.MIN_VALUE)devuelve esto:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005Es importante tener en cuenta que esta función siempre devolverá números finitos como cadenas pero devolverá números no finitos (por ejemplo,
NaNoInfinity) 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.1o10o 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