HarmonyOS鸿蒙Next中后台传过来的18位number使用Axios会把最后三位四舍五入

HarmonyOS鸿蒙Next中后台传过来的18位number使用Axios会把最后三位四舍五入 第一个问题: 在postman中测试的数据为 { “order_id”: 316174100416, “money_type”: 3, “title”: “钢管”, “payment”: “微信支付”, “pay_status”: 1, “price”: 1, “pay_time”: “2021-11-08 11:23:26”, “is_invoice”: false }

在axios response打印为 { “order_id”: 316174100416, “money_type”: 3, “title”: “钢管”, “payment”: “微信支付”, “pay_status”: 1, “price”: 1, “pay_time”: “2021-11-08 11:23:26”, “is_invoice”: false } 最后三位被四舍五入了

第二个问题: 我bean类里的order_id定义为string类型,但是在Text中使用该数据会不显示,必须手动的Text(order_id +"")才会显示,是不是Text会把数字类型的字符串转为number型


更多关于HarmonyOS鸿蒙Next中后台传过来的18位number使用Axios会把最后三位四舍五入的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

建议你从后端传过来的order_id类型为string类型,防止出现精度丢失问题,测试数据中这个order_id类型并不是string类型,Text并不会有您说的这种情况,可能需要检查下您的代码具体类型是做的什么样得转换

ts语法没有long类型,用number处理大数据会出现精度丢失的情况,必要时可以使用bigint替换number。 例如:

let a: bigint = 316174180775100416n

更多关于HarmonyOS鸿蒙Next中后台传过来的18位number使用Axios会把最后三位四舍五入的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用Axios进行网络请求时,如果后台传过来的18位number在JavaScript中被处理,可能会出现最后三位四舍五入的情况。这是因为JavaScript的Number类型只能安全表示最大为9007199254740991(即2^53 - 1)的整数。超过这个范围的整数在JavaScript中会被近似处理,导致精度丢失。

要解决这个问题,可以使用字符串来处理大整数。具体方法是确保后台返回的18位number以字符串形式传递,而不是直接作为数字传递。在前端接收到数据后,继续保持其为字符串格式,避免将其转换为JavaScript的Number类型。

例如,可以在Axios请求的配置中设置responseType'json',并在处理响应数据时确保大整数字段以字符串形式存在。如果后台返回的是JSON格式的数据,可以在JSON解析时使用reviver函数将大整数字段保持为字符串。

axios.get('/api/data', {
  responseType: 'json'
}).then(response => {
  const data = JSON.parse(response.data, (key, value) => {
    if (key === 'largeNumberField') {
      return value.toString(); // 将大整数字段保持为字符串
    }
    return value;
  });
  console.log(data.largeNumberField); // 输出字符串形式的18位number
});

通过这种方式,可以避免JavaScript对大整数的精度丢失问题,确保18位number的完整性和准确性。

在HarmonyOS鸿蒙Next中,如果通过Axios接收到的18位number数据最后三位被四舍五入,可能是由于JavaScript的数值精度限制。JavaScript中的Number类型只能安全表示最多15-16位的整数。建议将后端返回的number类型数据转换为字符串类型,以避免精度丢失。可以在Axios的响应拦截器中进行数据转换:

axios.interceptors.response.use(response => {
  if (response.data.number) {
    response.data.number = response.data.number.toString();
  }
  return response;
});

这样,前端接收到的18位number数据就不会被四舍五入。

回到顶部