4

可能重复:
在 Javascript 中错误地舍入大数字

我正在使用 jQuery.parseJSON() 来获取一个 json 字符串并使其成为一个对象。json 字符串由我们的服务器放置在带有初始标记的脚本标记中。json 字符串包含引用我们网站上不同资源的值。

这个在开发中被忽视的问题在实现中存在,现在开始抬头。我们的服务器是基于java的。数值大部分表示为 Long。所以 json 字符串会有类似“...'id': 25783071737028608...”的内容。这是一个问题,因为这个值超过了 JS Number 类型的最大值 10 的两个整数幂。在这种情况下,数字会向上取整:25783071737028610,这会导致各种数据不一致问题。

这种类型的模式在我们的网站上无处不在,这些值代表我们数据库中的值。我想避免对数据库进行大规模重构。我还想避免仅将内容作为字符串传递给浏览器(“...'id':”25783071737028608“...”,因为查找 long 传递给 javascript 的每个实例都需要对我们的数据库进行大规模重构。

无论如何在 JavaScript 中表示 Java 长类型?如果没有(我相信是这种情况),是否有任何创造性的解决方法可以用来解决类似问题?

4

3 回答 3

3

正如您已经提到的,您的值超过了 JavaScript 中的最大整数值,因此除了将值作为字符串传递或编写自己的 JavaScript JSON 解析器(或修改 jQuery 解析器)并将长整数值解析为字符串之外,您无能为力。

于 2012-08-31T18:36:39.307 回答
0

您必须在服务器上将数字编码为字符串,或者在 JavaScript 中编写自己的 JSON 解析器来处理太大的数字常量。

(关于 SO 至少还有一个与此几乎相同的问题。)

编辑-抱歉,我错过了您说无法更改编码的部分。好消息是您应该能够获取 JSON2 解析器源并对其进行修改,也许可以将所有数字常量解释为字符串,或者长度超过一定位数的字符串。

糟糕,json2.js“解析器”只是一个确保调用eval()不会导致问题的消毒剂。好吧,我认为这种方法是您唯一的选择。如果您的 JSON 表达式的结构足够规则且足够简单,您可能可以使用正则表达式“修复”它们预解析,但如果不是,那么它就是 JavaScript 中的 JSON 解析器。

于 2012-08-31T18:24:54.303 回答
-1

JavaScript 中的数字是双精度浮点数,这意味着它们具有大约 15 位的精度。超过 15 位的数字以相同的方式近似1/3

即使您可以将其更改为字符串,您也无法以任何方式操作该数字。老实说,我想不出任何理由为什么你的身份证号码会在千万亿...

于 2012-08-31T18:37:49.447 回答