鸿蒙Next中json.parse精度丢失问题如何解决

在鸿蒙Next中使用json.parse解析JSON数据时,遇到数值精度丢失的问题,比如长数字被截断或科学计数法显示。请问如何避免这种精度丢失?是否有特定的配置或替代方案可以保留原始数值精度?

2 回复

鸿蒙Next中JSON.parse精度丢失?试试用BigInt处理大数,或者用第三方库如json-bigint。实在不行,手动字符串处理,虽然有点土但管用。记住,别让数字偷偷“减肥”!😄

更多关于鸿蒙Next中json.parse精度丢失问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,JSON.parse处理大数字时可能出现精度丢失,因为JavaScript默认使用双精度浮点数(64位)表示所有数字。以下是解决方案:

1. 使用JSON.parse的reviver参数

const jsonString = '{"id": 123456789012345678}';
const obj = JSON.parse(jsonString, (key, value) => {
  // 识别大数字并转为字符串保存
  if (typeof value === 'number' && value > 2**53 - 1) {
    return value.toString();
  }
  return value;
});
console.log(obj.id); // "123456789012345678"

2. 使用第三方库

  • json-bigint
import JSONBig from 'json-bigint';

const jsonString = '{"id": 123456789012345678}';
const obj = JSONBig({ storeAsString: true }).parse(jsonString);
console.log(obj.id); // "123456789012345678"

3. 服务端配合返回字符串 协调后端将大数字字段以字符串格式返回:

{
  "id": "123456789012345678"
}

4. 自定义解析方案

function safeJSONParse(str) {
  return JSON.parse(str, (k, v) => {
    if (/^\d+$/.test(v)) {
      const num = Number(v);
      return num <= Number.MAX_SAFE_INTEGER ? num : v;
    }
    return v;
  });
}

最佳实践建议:

  1. 前后端统一使用字符串传输大数字(如ID、时间戳)
  2. 运算时使用BigInt类型:
const bigId = BigInt("123456789012345678");
console.log(bigId + 1n); // 123456789012345679n

根据具体场景选择合适方案,通常推荐方案1或2,同时建议在项目早期约定数据格式规范。

回到顶部