1

Tengo la siguiente cadena para convertir de cadena a numero: 42092537170271621 y no me convierte tal cual, vean los resultados:

Number('42092537170271621') -> 4209253717027162
parseInt('42092537170271621')->42092537170271624
parseFloat('42092537170271621')->42092537170271624

¿Por qué pasa esto? ¿Es por limites de ese método ?, y si es así ¿como podría solucionarlo?, debo convertir y luego sumar varios valores.

Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
joselo
  • 101
  • 7

3 Answers3

1

Tu número es mas grande que el máximo número seguro posible en Javascript, eso significa que números mas grandes que ese pierden precisión, eso es debido a la forma que tiene Javascipt de representar los números (Formato en coma flotante de doble precisión) abajo la comparación:

console.log(42092537170271621)
console.log(Number.MAX_SAFE_INTEGER)

Si necesitas operar con este número, puedes hacerlo o bien reduciéndolo de alguna manera (depende que quieras hacer) o hacer el algoritmo (una suma una división..etc) tu mismo y tratar cada parte del número individualmente. Aquí un ejemplo del algoritmo de la división.

Emeeus
  • 7,104
  • 8
  • 25
1

Ejemplo con la librería BitInteger para números que sobrepasasn la capacidad de int. Para más info.

console.log("4209253717027162111");
console.log(parseInt("4209253717027162111"));
console.log(bigInt("4209253717027162111"));
<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
Carmen
  • 7,127
  • 1
  • 13
  • 21
0

Este error se da porque los números desbordan una variable de tipo entero. Para poder usar números así de grandes (en caso de que sea estrictamente necesario operar con esos números) podés usar una librería externa como BigInteger.js.

Dado que en ES6 los enteros operan a 32 bits, el tamaño máximo de una variable de entero es 2,147,483,647.

Niche
  • 1,364
  • 4
  • 15
  • gracias por la solucion, las tomare en cuenta. – joselo Oct 17 '18 at 18:54
  • ¿Solucionó tu problema, @joselo? Por favor no olvides marcar la respuesta como aceptada si tu problema se solucionó. Puedes hacerlo marcando el ✓ en la parte izquierda de la respuesta (se pondrá verde y te dará 2 puntos de reputación). ¡Mira [¿Qué debo hacer cuando alguien contesta mi pregunta?](https://es.stackoverflow.com/help/someone-answers) si tienes alguna duda! – fedorqui Aug 21 '19 at 08:38