HarmonyOS鸿蒙Next中服务器返回的Json数据中Long类型转ArkTS的number失去精度

HarmonyOS鸿蒙Next中服务器返回的Json数据中Long类型转ArkTS的number失去精度 服务器返回的Json数据中Long类型转Ark TS的number失去精度。怎么才能保持数据的精度?

3 回复

这个是JavaScript语言特性导致。 3种方案:

三方库处理大数值精度,可以参考:[https://ohpm.openharmony.cn/#/cn/detail/@ohmos%2Fjson-bigint](https://ohpm.openharmony.cn/#/cn/detail/@ohmos%2Fjson-bigint) 非常抱歉,确实漏了

let options: JSON.ParseOptions = {
    bigIntMode: JSON.BigIntMode.PARSE_AS_BIGINT,
}
let numberText = '{"largeNumber":112233445566778899}';
let numberObj = JSON.parse(numberText,(key: string, value: Object | undefined | null): Object | undefined | null => {
  if(key === "largeNumber") return value;
  return value;
},options) as Object;
console.info((numberObj as object)?.["largeNumber"]);
// 输出: 112233445566778899

更多关于HarmonyOS鸿蒙Next中服务器返回的Json数据中Long类型转ArkTS的number失去精度的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,服务器返回的Json数据中的Long类型在转换为ArkTS的number类型时可能会失去精度。这是因为JavaScript的number类型是基于IEEE 754双精度浮点数标准,只能安全表示-2^53到2^53之间的整数。当Long类型的值超出这个范围时,转换过程中就会丢失精度。

ArkTS是基于TypeScript的,而TypeScript的number类型与JavaScript的number类型一致,因此同样存在精度问题。为了解决这个问题,可以将Long类型作为字符串传递,并在ArkTS中使用字符串来处理大整数,以避免精度丢失。

在鸿蒙Next中,处理Json数据时,可以通过自定义序列化和反序列化逻辑来确保Long类型的值以字符串形式传递和接收。例如,使用JSON.stringify和JSON.parse时,可以指定reviver函数或replacer函数来确保Long类型值以字符串形式处理。

具体实现可以参考鸿蒙开发文档中的相关API,确保在数据转换过程中保持精度。

在HarmonyOS鸿蒙Next中,当服务器返回的JSON数据中包含Long类型时,转换为ArkTS的number可能会失去精度,因为JavaScript/TypeScript的number类型是双精度浮点数,最大安全整数为2^53 - 1。如果Long值超过这个范围,精度会丢失。

解决方案:

  1. 使用字符串:将Long类型的数据以字符串形式返回,ArkTS中直接处理字符串。
  2. 使用BigInt:如果ArkTS支持BigInt,可以将Long转换为BigInt类型来处理大整数。
  3. 后端处理:让后端将Long类型数据拆分为多个小整数返回,前端再重新组合。

建议优先使用字符串形式,避免精度问题。

回到顶部