使用JSON.parse转换字符串对象的困惑

粥蛋蛋
  • 89

JSON.parse('{"id":1259744819760442395}')输出结果为{id:1259744819760442400},求教下大佬转换之后怎么id的值和原来的不一样了,最后三位一个395一个400

回复
阅读 763
8 个回答

因为JS中能精准表示的最大整数是Math.pow(2, 53) 你这个json里id值是个数字 太大了精度会出问题 搞成字符串就不会了

image.png

还真是这样, 或许是数值精度问题?

处理思路是别把他转为数值, 就用字符串的类型来处理, 用正则来取值

Number.isSafeInteger(1259744819760442395) // false

真要这么大的话只能使用字符串

超过js默认处理的数值范围啦。

超过JS默认数字的最大精度了,建议替换成字符串!

搜索「大数危机」、「js 精度丢失」、「BigInt」

众所周知JavaScript 仅有 Number 这个数值类型,而 Number 采用的时 IEEE754 规范中 64 位双精度浮点数编码。于是出现了经典的 0.1 + 0.2 === 0.30000000000000004 问题。

ES 最新数据类型中 bigInt 解决了这个问题。

回到最关心的问题:如何解决浮点误差。首先,理论上用有限的空间来存储无限的小数是不可能保证精确的,但我们可以处理一下得到我们期望的结果。

当你拿到 1.4000000000000001 这样的数据要展示时,建议使用 toPrecision 凑整并 parseFloat 转成数字后再显示,如下:

parseFloat(1.4000000000000001.toPrecision(12)) === 1.4  // True 

封装成方法就是:

function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}

为什么选择 12 做为默认精度?这是一个经验的选择,一般选12就能解决掉大部分0001和0009问题,而且大部分情况下也够用了,如果你需要更精确可以调高。

参考文章: https://github.com/camsong/blog/issues/9

image.png

这个不是因为JSON.parse转了数字变了,
是因为1259744819760442395超出了数字的最大安全数的范围

1259744819760442395n 转为bigint数据类型就可以正常展示了

前端需要用这么长的数字,还是要转为字符串的。这样id就对了。

我前几天刚刚遇到这个问题,也是后台给的id太长了

超过js数字的最大值了,这样解决:JSON.parse('{"id":"1259744819760442395"}'),变成字符串就好了

你知道吗?

宣传栏