【问题标题】:window.parseJSON is truncating large numbers [duplicate]window.parseJSON 正在截断大量数字 [重复]
【发布时间】:2012-08-26 14:03:09
【问题描述】:

可能重复:
Large numbers erroneously rounded in Javascript

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

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

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

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

【问题讨论】:

    标签: java javascript numbers long-integer truncation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 你在这里说的没有任何帮助。
        • 嗯,你并没有完全放弃。为什么你有 25 万亿作为身份证号码?你真的有 25 万亿个元素要识别吗?
        • @Kolink 他说它们是数据库键,所以可能是各种不同概念字段的某种 64 位编码。
        • @Pointy 双精度浮点数是 64 位长 - 这些数字完全超出了 64 位的范围。
        • @Kolink 为什么我有这么大的数字并不重要。关键是这些值是存在的,并且回过头来改变所有这些值是不切实际的。我正在寻找一个前端解决方案,我在我的问题中说明了这一点。
        猜你喜欢
        • 2017-03-18
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多