【问题标题】:Parse json in javascript - long numbers get rounded在 javascript 中解析 json - 长数字被四舍五入
【发布时间】:2013-03-28 18:43:40
【问题描述】:

我需要解析一个包含长数字(在 java servlet 中产生)的 json。问题是长数字被四舍五入。

当这段代码被执行时:

var s = '{"x":6855337641038665531}';
var obj = JSON.parse(s);
alert (obj.x);

输出是:

6855337641038666000

在此处查看示例:http://jsfiddle.net/huqUh/

为什么会这样,我该如何解决?

【问题讨论】:

  • 你需要对javascript中的数字进行计算吗?如果没有,您可以将其设置为 json 中的字符串以供客户端使用。
  • @Moshe:FWIW,这与 JSON 无关,parseInt('6855337641038665531', 10) 也返回 6855337641038666000,原因是 Kolink 解释的。

标签: javascript json


【解决方案1】:

正如其他人所说,这是因为数字太大。但是,您可以通过将数字作为字符串发送来解决此限制,如下所示:

var s = '{"x":"6855337641038665531"}';

然后,您可以使用 javascript-bignum 之类的库来处理数字,而不是使用 JSON.parse()。

【讨论】:

    【解决方案2】:

    这个数字太大了。 JavaScript 对数字使用双精度浮点数,它们有大约 15 位精度(以 10 为基数)。 JavaScript 可以可靠保存的最大整数是 251

    解决方案是使用合理的数字。没有真正的方法来处理如此大的数字。

    【讨论】:

    • 好吧,无论如何都无法使用双精度 IEEE-754 来处理它们。 :-)
    • @Niet the Dark Absol “解决方案是使用合理的数字。”你一定是在跟我开玩笑。在某些情况下,说“你想做错事”是有效的,但是当 javascript 不能像这个星球上的所有其他语言一样正确支持有符号的 64 位整数时,那么它绝对不是用户的错。
    • @Wulf 这是 JavaScript 的问题。不是 JSON。
    【解决方案3】:

    JavaScript 在不损失精度的情况下可以处理的最大数量是9007199254740992

    【讨论】:

    • Number.MAX_SAFE_INTEGER
    【解决方案4】:

    我前段时间遇到过这个问题,我可以使用这个库来解决:https://github.com/josdejong/lossless-json

    你可以看看这个例子:

    let text = '{"normal":2.3,"long":123456789012345678901,"big":2.3e+500}';
    // JSON.parse will lose some digits and a whole number:
    console.log(JSON.stringify(JSON.parse(text)));
    // '{"normal":2.3,"long":123456789012345680000,"big":null}'      WHOOPS!!!
    // LosslessJSON.parse will preserve big numbers:
    console.log(LosslessJSON.stringify(LosslessJSON.parse(text)));
    // '{"normal":2.3,"long":123456789012345678901,"big":2.3e+500}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多