这在以前的交互交互中经常会遇到,这是因为不同的编程语言和平台可能对数字的处理方式和精度有所不同。在处理这种情况时情况时,确保前置数据的类型和处理方式保持一致非常重要,队列出现准确性丢失和数据不一致的问题。
后端返回的数据与前端console.log数据不一致问题(network中preview和response返回不一致)
在前后端交互项目中偶尔会遇到后端返回的一大串数字,类似于订单编号(orderId),产品ID(productId)等等。有时候这些数字远超过十位、二十位多位的;
可能会有几十位的过长数字,前端一般拿到数据前面正常是后面几位都是0,但是在preview显示是正常。
这样的情况是,精度准确性损失。
中间省略多个踩坑过程,上最终解决方案:
1、数据类型不匹配:
由于报表使用了 Java 的 `long` 类型,long类型与javaScript中的长度是不一致的,Java中的long类型是JavaScript的好多倍。于是让后端将Long类型修改成String类型就解决了该问题。
前端同学别沉浸在自我怀疑中,在解析过长的字段时,Javascript的处理逻辑与后端有所差异,需要前后端一块排查协调。
2、数据长度过长:
Java使用了长整型(long)等具有更高精度的数据类型,而 JavaScript 中没有直接修改对应的类型,所以在将这些长数字传入到接口时可能会发生精度损失。后端提交一个长数字给前端时,JavaScript可能会损失尾部的准确性,因为JavaScript中的数值类型也有精度限制。让后端将数字长度缩小,前端js数字类型最长到16位数字。
备注:
精度丢失多出现于,后端使用的字段类型的精度与前端不一样。
前段时间遇到的productId有十九位长的数字。前端拿到的值后面三位全是0。postman跑出来的是十九位的正常的,后三位非0,但是console.log()打印的结果后三位是0;由于console.log()是异步的,可能页面的某些逻辑影响到了结果。我在接口返回的最始地方alert了下,发现最后三位还是0,与实际的值不符合。