Javascript 长整数

2022-08-31 16:23:53

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

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

我返回一个长整型值,然后:

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

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

从服务器返回字符串而不是 long,并使用以下方式处理它:

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

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

有没有以更明确的方式解决这一障碍?


答案 1

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

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

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


答案 2

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

我也想在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>