Javascript长整数

时间:2013-06-26 12:58:35

标签: java javascript json spring integer

我在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.Long类型键入的。如果我尝试将此POJO转换为另一个对象没有字段键入Long,则显然很麻烦。

以更清晰的方式解决这个障碍吗?

3 个答案:

答案 0 :(得分:66)

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

在JavaScript中,所有数字均为64 bits floating point numbers。这意味着您无法在JavaScript中表示所有Java长度。尾数的大小约为53位,这意味着您的号码793548328091516928无法准确表示为JavaScript编号。

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

您可以使用https://developer.here.com/documentation/android-premium/3.15/dev_guide/topics/map-service.html npm软件包。

它使您可以在JavaScript中使用64 bits integers

您还可以使用long JavaScript内置方法。