最近在公司用NODEJS做一个第三方应用,请求对方接口反馈的为JSON格式的数据,如下:
{"content": "Hi", "created_at": 1340863646, "type": "text", "message_id": 5758965507965321234, "from_user": "userC"}
其中message_id是19位number类型的。我用JSON.parse解析成JSON对象获取其中的信息,方法如下:
var jsonStr = '{"content": "Hi", "created_at": 1340863646, "type": "text", "message_id": 5758965507965321234, "from_user": "userC"}';
var jsonObj = JSON.parse(jsonStr);
console.log(jsonObj.message_id);//得到结果是:5758965507965321000
得到的结果的最后三位变成000了,请问如何处理?超过16位的数据解析后均会变为000;
目前用了个暂时规避的方法是,拿到json的string字符串,先把19位message_id的值两边加双引号,写的也有问题,有么有JS高手帮忙看看哈。
目前写的临时规避方案如下,是有BUG的:
//将message_id的19位数字两边加上双引号,避免JSON.PARSE时候,JS会对超过16位的数字转换错误
//JS/v8引擎都有这个BUG,如何处理?
return JSON.parse(jsonStr.toString().replace(/:\s\d{19}/g, ":\"@!#@!#$&\"").replace(/:\d{19}/g, ":\"@!#@!#$&\"").replace(/@!#@!#:\s/g,"").replace(/@!#@!#:/g,""));
14 回复
@xuhaijinsky2008 我现在的处理是返回前台数据的时候,只要是数字就转化为字符串返回,但是你这个数据源自己控制不了,可以去搜下有没有支持这种parse的库,实在找不到就只能自己写了,也不难就是了。
javascript 的数字类型是 64bit 浮点数,最大精度有限,您的值超出了这个范围,一共 19 位,
JS number 类型表示整数只能在 −9007199254740992 (−e53) and 9007199254740992 (e53) 这个范围内是精确的,这个只有 16 位,所以您的后3位自然就写 0 了。
e53 = 53/3 = 17.3*3 也就十进制 17 位所有的表达精度。
如果你非要使用数字类型,那么就没法解决。除非使用字符串型。