57

我在 javascript 中看到了最奇怪的事情之一。服务器端(弹簧):

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

我返回一个 long 值,并且:

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

它将长整数表示为“793548328091516900”,用 0 替换(实际上是四舍五入)最后两位数字。当我从任何浏览器的地址栏发出 GET 请求时,数字表示正确;因此,在我看来,这是一个 js 问题。

从服务器返回一个字符串而不是 long 并处理它:

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

显然是一个解决方案。但我没那么幸运,我必须处理一个复杂的 POJO(转换为 JSON),它的一些字段(一些是嵌套的)是用java.lang.Longtype 键入的。如果我尝试将此 POJO 强制转换为另一个没有字段类型为 Long 的对象,这显然很麻烦。

有没有更清晰的方式解决这个障碍?

4

3 回答 3

92

在 Java 中,您有 64 位整数,这就是您正在使用的。

在 JavaScript 中,所有数字都是64 位浮点数。这意味着您不能在 JavaScript 中表示所有 Java long。尾数的大小约为 53 位,这意味着您的数字 ,793548328091516928不能准确地表示为 JavaScript 数字。

如果你真的需要处理这样的数字,你必须用另一种方式来表示它们。这可以是一个字符串,也可以是一个特定的表示形式,如数字数组。JavaScript 中提供了一些“大数字”库。

于 2013-06-26T13:01:12.030 回答
10

可能会迟到,但绝对可以帮助第一次遇到这种情况的其他人。

我也想对 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>
于 2017-01-22T00:00:19.487 回答
1

您可以使用npm 包。

它让你64 bits integers在 JavaScript 中拥有。

您还可以使用BigIntJavaScript 内置方法。

于 2020-04-15T12:14:28.353 回答