在javascript中解析json - 长数字四舍五入

IT技术 javascript json
2021-03-04 13:24:49

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

执行此代码时:

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

输出是:

6855337641038666000

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

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

4个回答

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

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

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

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

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

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

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

Number.MAX_SAFE_INTEGER
2021-05-18 13:24:49

前段时间我遇到了这个问题,我能够使用这个库解决: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}'