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, это, очевидно, громоздко.
Есть ли какое-либо решение этого препятствия более ясным образом?
Ответы
Ответ 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>