web-dev-qa-db-fra.com

Javascript entier long

J'ai vu l'une des choses les plus étranges en javascript. Le côté serveur (printemps):

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

Je retourne une seule valeur longue et:

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

Il représente le nombre entier long sous la forme "793548328091516900" en remplaçant (en arrondissant bien) les deux derniers chiffres avec des 0. Lorsque je fais cette demande GET à partir de la barre d'adresse de n'importe quel navigateur, le nombre représenté correctement; C'est donc une question de JS, à mon avis.

Renvoyer une chaîne au lieu de long du serveur et la gérer avec:

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

évidemment une solution. Mais je ne suis pas si chanceux que, je dois gérer un POJO complexe (converti en JSON) dont certains champs (certains sont imbriqués) sont typés avec Java.lang.Long type. Si j'essaie de convertir ce POJO en un autre objet ne comportant pas de champs tapés Long, il est évidemment fastidieux.

Existe-t-il une solution plus claire à cet obstacle?

45
px5x2

En Java, vous avez des entiers 64 bits, et c'est ce que vous utilisez.

En JavaScript, tous les nombres sont nombres à virgule flottante 64 bits . Cela signifie que vous ne pouvez pas représenter en JavaScript tous les Java sont longs. La taille de la mantisse est d'environ 53 bits, ce qui signifie que votre nombre, 793548328091516928, ne peut pas être représenté exactement comme un nombre JavaScript.

Si vous avez vraiment besoin de traiter de tels nombres, vous devez les représenter d'une autre manière. Cela peut être une chaîne ou une représentation spécifique telle qu'un tableau de chiffres. Certaines bibliothèques de "grands nombres" sont disponibles en JavaScript.

72
Denys Séguret

Peut-être en retard, mais aide certainement ceux qui gèrent cette situation pour la première fois.

Moi aussi je voulais des calculs sur de grands nombres en JavaScript. Il y a beaucoup de bibliothèques disponibles pour traiter de tels numéros. Mais la plupart d’entre eux peuvent vous faire perdre beaucoup de temps. Ici, https://github.com/peterolson/BigInteger.js , est une solution directe, complète (pour les environnements JS et les environnements sans noeud) et opérationnelle pour toutes les opérations sur les grands nombres disponibles. ou trouvez l'extrait de code HTML de travail simple et exemple ci-dessous, qui calcule modulo/reste,

<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>