JavaScript 精度的问题时不时就会出现在前端开发面前,这里讨论的是大数精度丢失的问题

问题复现

前端向服务端请求某个订单数据,其中订单号 18 位,在数据库中以数字的形式保存,服务端查询数据库后向前端返回如下数据:

{code: 0,message: 'success',data: {uid: 10001,productId: 100003,orderId: 179828993786548789}
}

前端调用接口后,通过 http 传输的数据并不是 JSON,而是 JSON 字符串:

"{"code":0,"message":"success","data":{"uid":10001,"productId":100003,"orde
rId":179828993786548789}}"

由于在各大 HTTP 请求库的内部,实现了对application/json 等各种类型返回数据的格式化,也就是调用JSON.parse来对请求过来的数据进行处理,因此,前端通过这些调用获取到的数据已经是被格式化了,得到了如下数据:

{code: 0,message: 'success',data: {uid: 10001,productId: 100003,orderId: 179828993786548800}
}

很明显可以看到,orderId变化了,就是由于精度问题。

如何解决

其实最简单的解决方案,也是大家一下子就能想到的,就是让服务端把订单号以字符串的形式返回回来。这是最简单最便捷的解决方式。

我们这里仅针对这个问题来解决问题,从自身出发寻找解决方案。

无论是 fetch 还是 axios 等各种 HTTP 库,都提供了类似于 formatResponseData 的方法,可以自己传入格式化的方法而不是使用默认的 JSON.parse。问题的解决入口就在于此。

方案一(不推荐)

formatResponseData中,找到对应的字段,并将其值改为字符串,再使用JSON.parse方法来格式化。

为什么不推荐呢?不通用,仅针对当前业务解决问题。

方案二 (推荐)

使用 json-bigint 处理返回值。

json-bigint 提供了几个示例,为了彻底解决,将大数转换为字符串是比较保险的方案,因此推荐下面这个方案:

Input:

var JSONbigString = require('json-bigint')({"storeAsString": true});
var key = '{ "key": 1234567890123456789 }';
console.log('nnStoring the BigInt as a string, instead of a BigNumber');
var withString = JSONbigString.parse(key);
console.log('Input:', withString)

Output:

Storing the BigInt as a string, instead of a BigNumber
Input: { "key": "1234567890123456789" }

总结

如果服务端能良心一点,就不会返回超精度类型的数据给前端,我恨!

欢迎关注同名微信公众号:「WeCode365」

javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案相关推荐

  1. JS中(JS转换json/jQuery转换json)中的long型大数精度丢失问题

    最近在后台向前台传输对象id时,遇到一个奇怪的问题.类似代码如下: var str = '{"id":217998860110340096}'; var jsonObj1 = $. ...

  2. 关于JS中使用JSON.parse长整型数丢失精度的问题解决

    var json = '{"smallNumber": 1, "bigNumber" : "1155931057176506370"}'; ...

  3. JavaScript知识点之JSON.parse

    JSON.parse能格式化的的字符串规格,键名和键值(若是字符串)必须用双引号"来包围,不能用单引号'. 所以构建字符串的时候必须用: '{"name": " ...

  4. JavaScript 进制之间的转换、大数或小数精度丢失、js不同进制的表示(分享)

    文章目录 1. toString(radix) 2. parseInt(string, radix) 3. 0.1 + 0.2 !=== 0.3 4. BigInt() 5. js不同进制的表示 1. ...

  5. JSON.parse和JSON.stringify 参数详解

    JSON.parse和JSON.stringify这两个浏览器自带(IE6/7除外)的方法平常我们经常用到,但是一般都只是用到了他们的第一个参数,比如字符串转对象:JSON.parse('{}')   ...

  6. json.stringfy()和json.parse()

    json.stringfy()和json.parse() json.stringfy()将对象.数组转换成字符串:json.parse()将字符串转成json对象. 1. json.stringfy( ...

  7. JSON.stringify和JSON.parse之间的区别

    本文翻译自:Difference between JSON.stringify and JSON.parse I have been confused over when to use these t ...

  8. html页面解析json,JavaScript如何解析json?

    javascript如何解析json?下面本篇文章就来给大家介绍一下使用javascript解析json的方法,希望对大家有所帮助. 什么是JSON?JSON 指的是 JavaScript 对象表示法 ...

  9. JSON.parse() 中 reviver参数的理解

    今天在去了解 JSON.parse() 中 reviver参数时发现了中有一个例子很有意思. 例子如下: JSON.parse('{"p": 5}', (key, value) = ...

最新文章

  1. 人是被经验塑造的动物,一家公司也是
  2. Rxjava之操作符distinct和elementAt
  3. 【错误记录】Git 使用报错 ( git branch -a 仍能查询到已经删除的远程分支 )
  4. 2017中国大学生程序设计竞赛 - 网络选拔赛 [1005 - CaoHaha's staff] 贪心
  5. ubuntu20.04安装搜狗输入法(社区版+个人版)
  6. k8---proxy
  7. html 图片导出excel,用JavaScript导出图片到Excel
  8. api es7 删除所有数据_男子让月薪6万的人技术入股,结果工作3月蒙了:删除所有数据入职其他公司...
  9. go导出mysql中的excel表_golang web 开发 从数据库 导出到excel案例
  10. 苹果4s怎么绕过id激活_急急急,iPhone4s,怎么绕过激活锁。
  11. UTM(Urchin Tracking Module)简介
  12. linux mv命令例子,linux命令mv
  13. Cathy推荐Java面试题
  14. 复工后,企业裁员、降薪前必须了解的10个法律问题
  15. 【密码学】古代、古典密码
  16. EtherCAT的从站配置
  17. php 可视化模板编辑,MetInfo
  18. 黑盒测试、灰盒测试、白盒测试、单元测试是什么?它们有什么区别?
  19. matlab中的折现图
  20. 中文手写输入 (一)

热门文章

  1. python——LeetCode刷题
  2. Python【算法中心 01】Web框架Django入门(安装+项目创建+应用创建+服务启动)Python搭建算法中心后台实例分享
  3. fastjson safemode_它又又又来了,Fastjson 最新高危漏洞来袭!
  4. asp多表查询并显示_零公式实现多表数据查找!3步设置,简单高效!3分钟学会,真香...
  5. 【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】
  6. jQuery——封装form表单的数据为json对象
  7. java 修改商品如何实现的_Javaweb-案例练习-5-商品数量修改和合计金额实现
  8. 一致性hash算法使用
  9. openfire SparkWeb 安装配置
  10. MySQL学习笔记07【事务、用户管理和权限管理】