Вопрос: Javascript long integer


Я видел одну из самых странных вещей в javascript. Серверная сторона (пружина):

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

Я возвращаю одно длинное значение и:

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

Он представляет длинное целое число как «793548328091516900», заменив (округляя) две последние цифры с 0s. Когда я делаю этот запрос GET из адресной строки любого браузера, число отображается правильно; таким образом, это вопрос js, на мой взгляд.

Возврат строки вместо длинного от сервера и ее обработка с помощью:

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

очевидно, решение. Но мне не очень повезло, что мне приходится обрабатывать сложный POJO (преобразованный в JSON), некоторые поля которого (некоторые вложенные) набираются с помощью java.lang.Long тип. Если я попытаюсь передать это POJO другому объекту, не имея полей, набранных Long, это, очевидно, громоздко.

Есть ли какое-либо решение этого препятствия более ясным образом?


32


источник


Ответы:


В Java у вас есть 64-битные целые числа, и именно это вы используете.

В JavaScript все номера 64-битные числа , Это означает, что вы не можете представлять в JavaScript все Java longs. Размер мантиссы составляет около 53 бит, что означает, что ваш номер, 793548328091516928, не может быть точно представлена ​​как номер JavaScript.

Если вам действительно нужно иметь дело с такими цифрами, вы должны представить их по-другому. Это может быть строка или конкретное представление, такое как цифровой массив. Некоторые библиотеки «больших чисел» доступны в JavaScript.


52



Может быть, поздно, но определенно помогает другим, которые впервые запустили эту ситуацию.

Мне тоже хотелось, чтобы некоторые вычисления были на большом количестве в JavaScript. Существует множество библиотек, доступных для работы с такими номерами. Но большинство из них могут потратить много времени. Вот, https://github.com/peterolson/BigInteger.js , является прямым, полным (для среды с не-узлами и узлами JS), а также рабочим решением для всех операций с большими количествами. или найти следующий простой и примерный фрагмент кода HTML, который вычисляет модуль / остаток,

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

6