window.parseJSON正在截断大数字

时间:2012-08-31 18:19:35

标签: java javascript numbers long-integer truncation

  

可能重复:
  Large numbers erroneously rounded in Javascript

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

在开发过程中忽略了实现这一问题的问题,现在开始重新开始。我们的服务器是基于java的。数值大部分表示为Longs。所以json字符串会有“......'id':25783071737028608 ......”。这是一个问题,因为这个值超过JS Number类型的最大值两个10的整数。在这种情况下,数字被四舍五入:25783071737028610,这会导致各种数据不一致问题。

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

无论如何在JavaScript中表示Java long类型?如果没有(我认为是这种情况)是否有任何创造性的工作,你可能已经习惯解决类似的问题?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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

糟糕的是,json2.js“解析器”只是一个清理程序,可确保调用eval()不会导致问题。嗯,我认为这种方法是你唯一的选择。如果JSON表达式的结构足够规则和简单,那么您可以使用正则表达式对其进行预解析,但如果没有,那么JavaScript中的JSON解析器就是它。

答案 2 :(得分:-1)

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

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