因为js语言问题,数字大于16位后,会丢失16位以后的数字:比如声明 let n = 1234567890123456789;打印n之后会显示1234567890123456800;
同理JSON.parse将json字符串转为Object时,如果其中有大数字的值,也会发生精度丢失问题。
使用uni.request或uniCloud.httpclient.request 接收远程api返回数据时,如果返回数据里有大数字,并且直接设置了返回数据类型为json的话,则不能正常接收大数字。
此时就需要先接收为纯文本,也就是dataType = "text",再通过脚本匹配大数字后,给其加上字符串的引号,再进行JSON.parse的转换。这样就能正确接收大数字值了。
下面是转换函数实现:
// 解决大数字转换丢失问题
function jsonParse(text) {
text = text.replace(/([^"'\d])(\d{16,})/g, "$1\"$2\"")
return JSON.parse(text);
}
0 个评论
要回复文章请先登录或注册