接口返回数字长度太长导致精度丢失(丢失精度)

现象:

后端返回 id字段是使用 “雪花算法”生成的,19位,但是在前端查看的时候,反显后几位都是0了,精度丢失!

  • 接口地址直接在浏览器打开(get),显示正常:

在这里插入图片描述

  • 在netWork中查看接口返回:
    在这里插入图片描述

此时数字已经丢失精度了!

解决

  1. 后端注解:https://blog.csdn.net/weixin_46286156/article/details/124819784
    https://zimug.blog.csdn.net/article/details/108212633

  2. 前端使用:https://amore.blog.csdn.net/article/details/118547668

插件:json-bigint

yarn add json-bigint
//或
npm install json-bigint

axios.defaults.transformResponse = [
  function (data) {
    const json = JSONBIG({
      storeAsString: true
    })
    const res = json.parse(data)
    return res
  }
]

在这里插入图片描述

丢失精度的原因:

https://juejin.cn/post/7264208575973621815

场景:

  1. 浮点数的计算,包括加减乘除,都会这样。eg:
正常计算:0.1 + 0.2 = 0.3
JavaScript 计算:0.1 + 0.2 = 0.30000000000000004

正常计算:1 - 0.9 = 0.1
JavaScript 计算:1 - 0.9 = 0.09999999999999998
  1. 超过最值:js 16位,后端雪花返回19位。准确说是:±9007199254740991。
  2. 保留指定小数位。
console.log(1.585.toFixed(2)) // 1.58 ——> 期望为:1.59

原因:转二进制的时候,出问题了。
实际上会底层会进行 十进制 和 二进制 的相互转换,而这个转换过程就有可能会出现 精度丢失,因为十进制转二进制后可能产生 无限循环 部分,而 实际存储空间是有限的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在React中使用useState来保存接口返回的数组,并且在判断数组长度时报错的原因可能是因为在初始渲染时,接口返回的数组还没有被赋值给useState的初始值,导致尝试访问未定义的属性长度(length)而报错。 为了解决这个问题,你可以在定义useState时,给它一个初始值,例如一个空数组[],这样即使接口返回的数组还没有被赋值,useState也会使用初始值进行渲染。然后在接口返回数据后,使用useState的更新函数(setState)来更新保存的数组。 下面是一个示例代码: ```javascript import React, { useState, useEffect } from 'react'; function YourComponent() { const [data, setData] = useState([]); useEffect(() => { // 模拟接口返回的数据 setTimeout(() => { const responseData = [1, 2, 3]; // 假设接口返回的数组 setData(responseData); }, 2000); }, []); return ( <div> {data.length > 0 ? ( <p>数组长度为:{data.length}</p> ) : ( <p>数组正在加载中...</p> )} </div> ); } export default YourComponent; ``` 在上述代码中,useState的初始值是一个空数组[]。在useEffect中模拟了一个2秒后返回接口数据,并使用setData函数来更新保存的数组值。在组件渲染时,通过判断data数组的长度来显示不同的内容。 这样,即使在初始渲染时接口返回的数组还没有被赋值,也不会报错,并且会显示"数组正在加载中...",直到数据返回后显示数组的长度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值