【问题标题】:JSON.Stringify() on big numbers alters the numeric value?大数字上的 JSON.Stringify() 会改变数值吗?
【发布时间】:2011-12-27 06:04:24
【问题描述】:

我有一个 WCF 服务操作,它返回一个具有 longList<string> 属性的对象。当我在 WCF 应用程序中测试操作时,一切正常并且值正确。但是,我需要能够使用 jQuery 和 JSON 格式调用服务。当我在OnSucceed 函数中读取它时,long 属性的值显然会发生变化。

搜索后我发现JSON.stringify 改变了很大的值。所以在这样的代码中:

alert(JSON.stringify(25001509088465005));

...它会将值显示为25001509088465004

发生了什么?

在这里演示:http://jsfiddle.net/naveen/tPKw7/

【问题讨论】:

  • 请把你的问题说得更清楚。
  • 只需测试上面的 javascript 代码,看看你发送了什么以及 JSON.stringify 返回了什么。
  • 由于 javascripts Number 类型的精度限制。另见:stackoverflow.com/questions/588004/is-javascripts-math-broken
  • @Gaurav:问题很清楚。试试看吧。
  • @Amir Mohsen:这与 JSON 事实上无关。试试这个。 alert(25001509088465005);

标签: javascript jquery json


【解决方案1】:

JavaScript 使用IEEE-754 双精度(64 位)格式表示数字。据我了解,这为您提供 53 位精度,或 15 到 16 个十进制数字。您的数字的位数超出了 JavaScript 所能处理的范围,因此您最终得到了一个近似值。

您需要对这个大数字进行数学运算吗?因为如果它只是某种 ID,您可以将其作为字符串返回并避免问题。

【讨论】:

  • 是的,但我想拥有它,但最后我收到它作为字符串,这就是结束。
  • JavaScript 中没有“长”数据类型,只有数字。
  • 是的,我应该明确地说“JavaScript 表示 所有 数字使用...”
  • 最后我用字符串代替了那个 17 位数字,现在生活很美好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2012-07-02
  • 2016-04-17
相关资源
最近更新 更多