用vue做了个小工具,发现id字段在前端显示不正确。
后台id:6599188369064296448,前端显示:6599188369064296000。
后面显示几个0,明显是失去精度了。
查询资料,发现一个好文章,简单来说就是js的number类型只能支持最大数是9007199254740991,超过就显示不正常了。(可见js不行,java才是最好的语言。。。
一般来说,后台把数字转成string返回可以解决,but稍有骨气的后端就不会答应(是我
不得不说github是个好东西,早就有人给出方案了。
package.json引入"lossless-json": "1.0.3",修改axios的默认json转换
const LosslessJSON = require('lossless-json')
axios.defaults.transformResponse = [(data, headers) => {
if (typeof data === 'string') {
try {
// 这里默认方法是JSON.parse,我们给它替换一下
data = LosslessJSON.parse(data, reviver)
} catch (e) { /* Ignore */ }
}
return data
}]
// 对number值进行转换,如果不用这个方法,Number类型就变成LosslessNumber,有些地方会报错,看情况处理
function reviver(key, value) {
if (value && value.isLosslessNumber) {
if (Number.isSafeInteger(parseInt(value.value))) {
return parseInt(value.value)
}
return value.value
} else {
return value
}
}
参考链接: