JSON解析将某些数字转换为其他数字[重复]

Posted

技术标签:

【中文标题】JSON解析将某些数字转换为其他数字[重复]【英文标题】:JSON parse converts certain number to somethig else [duplicate] 【发布时间】:2017-03-25 17:11:30 【问题描述】:

我发现在通过parseInt 时有一些号码正在更改为其他号码。

console.log( parseInt( 10153315281647662, 10 ) ); //10153315281647662
console.log( parseInt( 10153315281647663, 10 ) ); //10153315281647664
console.log( parseInt( 10153315281647664, 10 ) ); //10153315281647664
console.log( parseInt( 10153315281647665, 10 ) ); //10153315281647664
console.log( parseInt( 10153315281647666, 10 ) ); //10153315281647666
console.log( parseInt( 10153315281647667, 10 ) ); //10153315281647668
console.log( parseInt( 10153315281647668, 10 ) ); //10153315281647668
console.log( parseInt( 10153315281647669, 10 ) ); //10153315281647668
console.log( parseInt( 10153315281647660, 10 ) ); //10153315281647660


var str = ' "id" : 10153315281647663 ';
console.log(  JSON.parse( str ) ) // id : 10153315281647664

我正在处理一些大数字,parseInt 或将 str 更改为 JSON 与数字正在更改结果中的数字。这不是因为整数堆栈溢出,因为较大的数字 10153315281647666 解析正确,而 10153315281647663 解析不正确,这背后的原因是什么?

我已通过将所有内容解析为字符串来解决此问题,但这是什么原因?

【问题讨论】:

【参考方案1】:

无需解析数字,它只是最大可能位置数的结束,而不会失去IEEE 754 格式的精度。

console.log(10153315281647662); //10153315281647662
console.log(10153315281647663); //10153315281647664
console.log(10153315281647664); //10153315281647664
console.log(10153315281647665); //10153315281647664
console.log(10153315281647666); //10153315281647666
console.log(10153315281647667); //10153315281647668
console.log(10153315281647668); //10153315281647668
console.log(10153315281647669); //10153315281647668
console.log(10153315281647660); //10153315281647660

【讨论】:

【参考方案2】:

您尝试解析的数字太大。它can't be reliably stored 作为双精度浮点数

console.log(10153315281647663 > Number.MAX_SAFE_INTEGER);
console.log(10153315281647663);
console.log(Number.MAX_SAFE_INTEGER);

【讨论】:

但结果似乎不是“意外”,甚至是随机的。有些被正确解析,有些则没有,对于给定的数字,结果总是完全相同的。这背后有什么原因吗? @developernaren:那是因为丢失了最低有效位。我会(尝试)添加一个解释。 如果没有它,我真的无法给出正确的解释,从而导致文字墙。这是一个更好的资源,可以解释为什么您会看到您所看到的数字:blog.vjeux.com/2010/javascript/…

以上是关于JSON解析将某些数字转换为其他数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据实体转换为 JSON 字符串

如何将数据实体转换为 JSON 字符串

Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串

php数组转json对象并保留数字索引

json字符串和数字互转

使用 json_encode,有没有办法强制某些值不转换为数字?