【问题标题】:Javascript long integerJavascript长整数
【发布时间】:2013-06-23 15:06:48
【问题描述】:

我看到了 javascript 中最奇怪的东西之一。 服务器端(spring):

   @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 问题。

从服务器返回一个字符串而不是长字符串并使用:

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

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

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

【问题讨论】:

  • 值得注意的是,ECMAScript 规范的最新草案 (tc39.es/ecma262/#sec-bigint-objects) 现在有一个 BigInt 类型(尽管浏览器支持不稳定)。但是,JSON 还不支持 BigInts。所以现在真正的问题在于序列化/反序列化,而不是 JavaScript 本身。

标签: java javascript json spring integer


【解决方案1】:

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

在 JavaScript 中,所有数字都是64 bits floating point numbers。这意味着您不能在 JavaScript 中表示所有 Java long。尾数的大小约为 53 位,这意味着您的数字 793548328091516928 不能准确地表示为 JavaScript 数字。

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

【讨论】:

  • @px5x2 没有基于“javascript number”的解决方案。您的问题的最佳解决方案将取决于确切的要求。如果您只想显示它们,请将它们作为字符串发送。
  • @dystroy:由于时区问题,这是个坏主意
  • @R.Moeller 时区?你确定你评论的答案正确吗?
  • @dystroy 你是对的,因为这个问题通常出现在较长的时间戳/日期中,我自己隐含地将其放入问题中:-)
  • 我自己刚刚发现了这个事实......这真是太疯狂了 Javascript 设计得多么糟糕。 facepalm 永无止境。
【解决方案2】:

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

我也想对 JavaScript 中的大数进行一些计算。有很多图书馆可以处理这些数字。但他们中的大多数可能会浪费你很多时间。 在这里,https://github.com/peterolson/BigInteger.js 是一个直接的、完整的(用于非节点环境和节点 JS 环境)和有效的解决方案,适用于所有可用的大量操作。 或找到以下简单的示例工作 HTML 代码 sn-p 计算模数/余数,

<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>

【讨论】:

    【解决方案3】:

    您可以使用long npm 包。

    它让你在 JavaScript 中拥有64 bits integers

    您也可以使用BigInt JavaScript 内置方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多