问题描述:
在处理字符串转化为json对象时,发现Number类型的值发生了变化。
let json = '{"id":2024022210570104301}';
JSON.parse(json);
// 结果 精度丢失
{id: 2024022210570104300}
原因分析:
由于JavaScript使用的IEEE 754标准双精度浮点数表示,它有53位的精度,JSON.parse在解析大整数时可能会出现超出了JavaScript的Number类型所能表示的范围,造成精度丧失,导致尾数变为0。
解决方案:
用正则表达式把传过来的字符串中的id从数值改为字符串,以免丢失精度。
let json = '{"id":2024022210570104301}';
json = json.replace(/\"id":(\d+)/g,'"id": "$1"');
JSON.parse(json);
// 虽然不是数值型,但精度没有丢失
{id: '2024022210570104301'}
在这段代码中,我们使用了String.prototype.replace方法和一个正则表达式来匹配"id":后面跟着的数字。正则表达式中的$1是一个捕获组,它匹配的是(\d+)部分,即id后面的数字。然后,我们将这个数字用双引号括起来,并替换掉原始匹配的部分。