HarmonyOS 鸿蒙Next 浮点类型数据精度丢失

发布于 1周前 作者 htzhanglong 最后一次编辑是 5天前 来自 鸿蒙OS

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来处理大数。

cke_1572.png

cke_2080.png

const response: GeneratedObjectLiteralInterface_1 = {
  Id: "976795458280095744" // 注意这里是字符串格式
};
// 将ID转换为BigInt
const idBigInt = BigInt(response.Id);

console.log(“1”,idBigInt);

我找到了问题所在,貌似是在网络请求,请求成功后,此时的Id已经丢失精度了,请问该怎么处理,我在网上的方法是给axios添加transformResponse

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

接收用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);

关于HarmonyOS 鸿蒙Next数据精度丢失的问题,这通常与数据类型和表示范围有关。在鸿蒙系统中,如果处理大整数或高精度浮点数时,可能会遇到JavaScript双精度浮点数精度限制导致的精度丢失。建议检查数据类型,并使用适合的方法处理大数,如使用字符串处理或引入支持大数的库。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部