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

发布于 2022-09-12 13:33:01 字数 141 浏览 23 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

陌路终见情 2022-09-19 13:33:01

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

随心而道 2022-09-19 13:33:01

image.png

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

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

拥抱影子 2022-09-19 13:33:01
Number.isSafeInteger(1259744819760442395) // false

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

深海夜未眠 2022-09-19 13:33:01

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

无戏配角 2022-09-19 13:33:01

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

肥爪爪 2022-09-19 13:33:01

搜索「大数危机」、「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

二智少女 2022-09-19 13:33:01

image.png

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

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

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

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

平生欢 2022-09-19 13:33:01

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文