JSON.parse('{"id":1259744819760442395}')
输出结果为{id:1259744819760442400}
,求教下大佬转换之后怎么id的值和原来的不一样了,最后三位一个395一个400
JSON.parse('{"id":1259744819760442395}')
输出结果为{id:1259744819760442400}
,求教下大佬转换之后怎么id的值和原来的不一样了,最后三位一个395一个400
搜索「大数危机」、「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问题,而且大部分情况下也够用了,如果你需要更精确可以调高。
这个不是因为JSON.parse转了数字变了,
是因为1259744819760442395超出了数字的最大安全数的范围
1259744819760442395n
转为bigint数据类型就可以正常展示了
前端需要用这么长的数字,还是要转为字符串的。这样id就对了。
我前几天刚刚遇到这个问题,也是后台给的id太长了
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.3k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答819 阅读
因为JS中能精准表示的最大整数是Math.pow(2, 53) 你这个json里id值是个数字 太大了精度会出问题 搞成字符串就不会了