type parselong number hexadecimal floats java javascript json spring integer

parselong - number javascript



Entero largo de Javascript (2)

He visto una de las cosas más extrañas en javascript. El lado del servidor (primavera):

@RequestMapping(value = "/foo", method = RequestMethod.GET) @ResponseBody public Long foo() { return 793548328091516928L; }

Devuelvo un único valor largo y:

$.get(''/foo'').done(function(data){ console.log(data); });

Representa el entero largo como "793548328091516900" reemplazando (redondeando de hecho) los últimos dos dígitos con 0. Cuando hago esa solicitud GET desde la barra de direcciones de cualquier navegador, el número se representa correctamente; por lo tanto, este es un problema js, en mi opinión.

Devolviendo una cadena en vez de desde el servidor y manejándola con:

var x = new Number(data).toFixed();

obviamente una solución. Pero no tengo tanta suerte de tener que manejar un POJO complejo (convertido a JSON) cuyos campos (algunos están anidados) se escriben con el tipo java.lang.Long . Si intento enviar este POJO a otro objeto que no tiene campos escritos Long, obviamente es engorroso.

¿Hay alguna solución a ese obstáculo de una manera más clara?


En Java, tienes enteros de 64 bits, y eso es lo que estás usando.

En JavaScript, todos los números son números de coma flotante de 64 bits . Esto significa que no puede representar en JavaScript todas las longitudes de Java. El tamaño de la mantisa es de aproximadamente 53 bits, lo que significa que su número, 793548328091516928 , no se puede representar exactamente como un número de JavaScript.

Si realmente necesita lidiar con tales números, debe representarlos de otra manera. Esto podría ser una cadena o una representación específica como una matriz de dígitos. Algunas bibliotecas de "grandes cantidades" están disponibles en JavaScript.


Puede ser tarde, pero definitivamente ayuda a otros que corren esta situación por primera vez.

Yo también quería un cálculo en números grandes en JavaScript. Hay muchas bibliotecas disponibles para tratar esos números. Pero la mayoría de ellos puede perder mucho tiempo. Aquí, https://github.com/peterolson/BigInteger.js , es una solución directa, completa (para ambientes no nodo y entornos JS de nodos) y de trabajo para todas las operaciones en grandes cantidades disponibles. o encuentre el siguiente fragmento de código HTML de trabajo simple y de muestra que calcula el módulo / residuo,

<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script> <script type="text/javascript"> function modTest(){ var rem = bigInt("1738141852226360940").mod("32").valueOf(); console.log(rem); document.getElementById("remainder").innerHTML = rem; } </script> <BODY onload="modTest();"> <p id="remainder"></p> </BODY>