Подтвердить что ты не робот

Javascript long integer

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

   @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, это, очевидно, громоздко.

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

4b9b3361

Ответ 1

В Java у вас есть целых 64 бита и что вы используете.

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

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

Ответ 2

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

Мне тоже очень хотелось вычислить большие числа в JavaScript. Существует множество библиотек, доступных для работы с такими номерами. Но большинство из них могут потратить много времени. Здесь https://github.com/peterolson/BigInteger.js является прямой, полной (для среды без node и node 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>