Javascript长整数

px5*_*5x2 47 javascript java spring json integer

我在javascript中看到了一个最奇怪的东西.服务器端(弹簧):

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

我返回一个long值并且:

$.get('/foo').done(function(data){
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

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

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

var x = new Number(data).toFixed();
Run Code Online (Sandbox Code Playgroud)

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

有更清楚的方法解决这个障碍吗?

Den*_*ret 74

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

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

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

  • @ px5x2没有基于"javascript号码"的解决方案.解决问题的最佳方法取决于具体要求.如果您只想显示它们,请将它们作为字符串发送. (7认同)
  • @ R.Moeller时区?你确定你评论正确的答案吗? (3认同)
  • 我自己才发现了这个事实……设计如此糟糕的Javascript真是太疯狂了。facepalm永无止境。 (3认同)
  • @dystroy你是对的,因为这个问题通常出现在很长的时间戳/日期我自己隐瞒了这个问题:-) (2认同)

sre*_*ram 8

可能会迟到,但绝对帮助第一次经营这种情况的其他人.

我也想在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>
Run Code Online (Sandbox Code Playgroud)