HarmonyOS 鸿蒙Next 浮点类型数据精度丢失
HarmonyOS 鸿蒙Next数据精度丢失
接口返回数据:
Id:976795458280095744
我用bean对象接收时,试了用string、number和bigint类型定义都不行,结果都为976795458280095700,菜鸟一名,请问该如何解决?
8 回复
让后端给字符串类型,不要用long就好了 :)
import JsonBigInt from '[@ohmos](/user/ohmos)/json-bigint';
return await axios.get<T, AxiosResponse<T>, null>(constant.BASE_URL + urlName, {
params: query, transformResponse: (data: string) => {
try {
return JSON.parse(
JsonBigInt.stringify(
JsonBigInt.parse(data), null, null))
} catch (e) {
return JSON.parse(data)
}
}
})
JavaScript中数字的最大安全整数为2^53 - 1
(即 9007199254740991
),而976795458280095744
超出了这个范围,因此在处理这些大数时会出现精度丢失的问题,可以使用BigInt
来处理大数。
const response: GeneratedObjectLiteralInterface_1 = {
Id: "976795458280095744" // 注意这里是字符串格式
};
// 将ID转换为BigInt
const idBigInt = BigInt(response.Id);
console.log(“1”,idBigInt);
我找到了问题所在,貌似是在网络请求,请求成功后,此时的Id已经丢失精度了,请问该怎么处理,我在网上的方法是给axios添加transformResponse
接收用string,使用时用bigInt。
export class CollegeBean {
Id: string = '0';
// ...
}
let idStr = this.collegeBean?.Id.toString();
LogUtil.error("传值Id:" + idStr);
router.pushUrl({
url: "pages/college/CollegeDetailPage",
params: {
"id": idStr
}
});
let bigIntId = BigInt(idStr);
使用BigInt 或者使用第三方 decimal
参考:https://developer.huawei.com/consumer/cn/blog/topic/03155293544650023
关于HarmonyOS 鸿蒙Next数据精度丢失的问题,这通常与数据类型和表示范围有关。在鸿蒙系统中,如果处理大整数或高精度浮点数时,可能会遇到JavaScript双精度浮点数精度限制导致的精度丢失。建议检查数据类型,并使用适合的方法处理大数,如使用字符串处理或引入支持大数的库。如果问题依旧没法解决,请加我微信,我的微信是itying888。