码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 当Number类型的id超过16位时,JavaScript的数据处理和储存问题


    问题的背景:

    当接口返回的Nubmer类型id长度超过16位,js在把返回的数据转为JSON格式时,会把长度超过16位的Number类型的数据做处理,处理的方式的裁取前十六位,十六位以后的数字都补为0.

    (吐槽:不理解这种处理方式是咋样的脑回路???)

    首先是怎么检查出这种问题:

    如图,

    1.在【响应】里面,可以看到正确的数据,就是超过十六位,且十六位以后的数字不为0的数据。

    2.在【预览】里面,可以看到被转化为JSON的数据,此时超过16位的Number类型的数据已经被处理为错误数据

    思考为什么会出现这种问题:

    参考资料:

    ​​​​​​关于JavaScript中Number整数最大长度的一个疑问_mb5fe09d2d96fc4的技术博客_51CTO博客https://blog.51cto.com/u_15064069/3205654JS Number强类型转换数字超过16位精度丢失问题 - 简书问题图 Number转换19位(6145390195186705543)后结果为 6145390195186705000 造成原因:看网上资料说:js的number类型有个最...https://www.jianshu.com/p/d2eb9795c359百度安全验证https://baijiahao.baidu.com/s?id=1730543232132634655&wfr=spider&for=pc总结:

     js采用的是64位双精度,

    最小值为:Number.MIN_SAFE_INTEGER // -9007199254740991

    最大值为:Number.MAX_SAFE_INTEGER // 9007199254740991

    超出规定范围导致精度丢失 console.log(900719925474099177)

    解决方式:

    1.如果具体业务中后台返回的id超过16位,要让后台把id改为string类型 【个人觉得这是最优解】

    2.BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用Number表示的最大数字。BigInt 可以表示任意大的整数

    3.拦截 【响应】的数据,用正则匹配修改 超过16位的Number类型数值 ,修改为String类型

     方式三的实践:

    用的是axios做http请求,在Response里面加个拦截器,用正则匹配修改 超过16位的Number类型数值 ,修改为String类型

    参考资料:

    拦截器 | Axios 中文文档 | Axios 中文网https://www.axios-http.cn/docs/interceptorstransformResponse与axios的封装api_春风又一季的博客-CSDN博客_transformresponselet base = '';export const postRequest = (url, params) => { return axios({ method: 'post', url: `${base}${url}`,//Es6新语法 `${}` data: params, /* // `transformResponse` 在传递给 then/catch 前,允许修改响应数据 transformResponse: [functionhttps://blog.csdn.net/qq_40183281/article/details/107446718

    1. export function QueryByPage(query) {
    2. return fetch({
    3. url: '/lapi/bankAccount/QueryByPage',
    4. method: 'post',
    5. data: query,
    6. behaviorRecord: {
    7. name: '银行账户查询-查询列表'
    8. },
    9. transformResponse: [function (data) {
    10. try {
    11. // 对 data 进行任意转换处理
    12. // /^\d{m,n}$/
    13. let reg = /\d{9,30}/g
    14. const tarArr = data.match(reg)
    15. const repArr = []
    16. // 最终输出的json
    17. let resutlt = JSON.parse(data)
    18. if (Array.isArray(tarArr)) {
    19. for (let rep of tarArr) {
    20. repArr.push({
    21. key: [rep],
    22. val: Number(rep)
    23. })
    24. }
    25. }
    26. if (Array.isArray(resutlt.data.records) && resutlt.data.records.length > 0) {
    27. resutlt.data.records = resutlt.data.records.map(item => {
    28. item.id = repArr.find(obj => obj.val === item.id).key
    29. return item
    30. })
    31. }
    32. return resutlt
    33. } catch (error) {
    34. console.error(error)
    35. }
    36. }]
    37. });
    38. }

    其他的方式,思路也大同小异,主要是对原始数据做拦截,然后把超长的Numer数据替换为String类型即可。

  • 相关阅读:
    MySQL使用IF语句以及用case语句对条件或结果进行判断
    设计模式胡咧咧之策略工厂实现导入导出
    微信小程序,下载流文件并打开预览
    极智开发 | 讲讲 DOM 树
    pytest 运行方式、常用参数、前后置条件
    【模电实验】【超值1 + 1】【验证性实验——比例、求和运算电路实验】【验证性实验——各种非正弦信号发生器实验】
    Ansible在macOS上的安装部署
    Qt-day4
    [老文拾遗]如果我当上技术经理如何展开工作(三)
    香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付
  • 原文地址:https://blog.csdn.net/zxcv19961204/article/details/125479118
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号