Javascript 长整数

IT技术 java javascript json spring integer
2021-03-13 01:17:22

我在 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 的字段的对象,这显然很麻烦。

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

3个回答

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

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

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

@px5x2 没有基于“javascript 编号”的解决方案。您的问题的最佳解决方案将取决于确切的要求。如果您只想显示它们,请将它们作为字符串发送。
2021-04-15 01:17:22
@R.Moeller 时区?你确定你评论了正确的答案吗?
2021-04-20 01:17:22
@dystroy你是对的,因为这个问题通常出现在很长的时间戳/日期中,我自己隐含地把它放到了问题中:-)
2021-04-25 01:17:22
刚刚我自己发现了这个事实……Javascript 设计得多么糟糕真是太疯狂了。脸谱永无止境。
2021-05-02 01:17:22
@dystroy:由于时区的原因是个坏主意
2021-05-12 01:17:22

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

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

您可以使用npm 包。

它让你拥有64 bits integersJavaScript。

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

仅供参考,浏览器兼容性BigInt- caniuse.com/#feat=bigint
2021-05-04 01:17:22