一尘不染

Javascript长整数

json

我已经看到了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),其某些字段(有些是嵌套的)是用java.lang.Longtype键入的。如果我尝试将此POJO强制转换为另一个没有输入Long的字段的对象,则显然很麻烦。

有没有更清楚地解决这一障碍的办法?


阅读 316

收藏
2020-07-27

共1个答案

一尘不染

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

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

如果您确实需要处理此类数字,则必须以另一种方式表示它们。这可以是字符串,也可以是特定的表示形式,例如数字数组。JavaScript中提供了一些“大数字”库。

2020-07-27