js长整型的失真问题解决
遇到的问题:
后端返回的订单号是整型的,超过了Math.pow(2,53) = 9007199254740992,导致获取的数据失真。
类似问题:https://www.zhihu.com/question/34564427
解决方法及思路:
获取到后端的数据之后,将json字符串获取遍历,大于 9007199254740992的数值转为字符串,具体方法如下:
/**
* 因为js中的Json.parse()会让Number数据类型精度丢失
*/
function getRealJsonData(baseStr) {
if (!baseStr || typeof baseStr != 'string') return;
var jsonData = null;
try {
jsonData = JSON.parse(baseStr);
} catch (err) {
return null;
}
var needReplaceStrs = [];
loopFindArrOrObj(jsonData, needReplaceStrs);
needReplaceStrs.forEach(function (replaceInfo) {
var matchArr = baseStr.match('"' + replaceInfo.key + '":[0-9]{10,}');
if (matchArr) {
var str = matchArr[0];
var replaceStr = str.replace('"' + replaceInfo.key + '":', '"' + replaceInfo.key + '":"');
replaceStr += '"';
baseStr = baseStr.replace(str, replaceStr);
}
});
var returnJson = null;
try {
returnJson = JSON.parse(baseStr);
} catch (err) {
return null;
}
return returnJson;
} /**
* 遍历对象类型的
*/
function getNeedRpStrByObj(obj, needReplaceStrs) {
for (var key in obj) {
var value = obj[key];
// 大于这个数说明精度会丢失!
if (typeof value == 'number' && value > 9007199254740992) {
needReplaceStrs.push({ key: key });
}
loopFindArrOrObj(value, needReplaceStrs);
}
} /**
* 判断数据类型
*/
function getNeedRpStrByArr(arr, needReplaceStrs) {
for (var i = 0; i < arr.length; i++) {
var value = arr[i];
loopFindArrOrObj(value, needReplaceStrs);
}
}
/**
* 递归遍历
*/
function loopFindArrOrObj(value, needRpStrArr) {
var valueTypeof = Object.prototype.toString.call(value);
if (valueTypeof == '[object Object]') {
needRpStrArr.concat(getNeedRpStrByObj(value, needRpStrArr));
}
if (valueTypeof == '[object Array]') {
needRpStrArr.concat(getNeedRpStrByArr(value, needRpStrArr));
}
}
上面是转化的具体函数,接下来在返回数据的地方引用:
axios.post( url, data, {
'X-Request-Form': 'XHR',
headers: {
'Authorization': 'Bearer ' + token
},
responseType: 'text',
transformResponse: [function ( data ) {
return getRealJsonData( data )
}]
} ).then( response => {
console.log(response);
});
js长整型的失真问题解决的更多相关文章
- javascript没有长整型
记录一下前几天踩坑的经历. 背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了 奇怪的地方主要有以下几点: 项目在测试环境才会这样,在本机能够正常运行,多次重 ...
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
- Python基础:数值(布尔型、整型、长整型、浮点型、复数)
一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...
- Java把长整型时间转成字符串日期
数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- JAVA 长整型转换为IP地址的方法
JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...
- Long.parseLong(String s) 其中s必须是数字形式的字符串,才能运用该函数转化为长整型。
public class ConverTo { public static void main(String [] args) { String numberIn =args[0]; convertN ...
- php长整型完整输出
今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报 ...
- PHP长整型在32位系统中强制转化溢出
CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机 ...
随机推荐
- vue 数字随机滚动(数字递增)
html: <span v-for="i in numArr">{{i}}</span> data: numArr: [], methods: perN ...
- 第三次Scrum冲刺————Life in CCSU
# 第三次Scrum冲刺————Life in CCSU # 一.第三次Scrum任务 小组GitHub地址链接:https://github.com/LoneylittleTeam/Team 个人G ...
- 20164318 毛瀚逸 Exp4 恶意代码分析
---恢复内容开始--- 1 关键内容 系统运行监控 (1)使用计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述分析结果. (2)安装配置sys ...
- redhat6.5 redis单节点多实例3A集群搭建
在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...
- Kali Linux系统的安装、配置、使用
这个随便写的,随便看看就好,主要给讲一下安装过程 这里因为我物理机装的本来就是kali.所以懒得重装了,直接拿虚拟机演示一下 物理机安装kali的话,推荐使用rufus使用dd模式刻盘,不会造成之后的 ...
- creator NDK_PROJECT_PATH=null
NDK_PROJECT_PATH=null 其实不是一个错误= =,少年,不要纠结于此了. 主要问题在于这一句: process_begin: CreateProcess(NULL, E:/Andro ...
- ionic上拉加载组件 ion-infinite-scroll自动调用多次的问题
参考文章地址:http://www.cnblogs.com/luleixia/p/6402418.html ionic 一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面 ...
- 常规DP专题练习
POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...
- zabbix自定义监控主机
目的: 从头开始自定义监控主机的磁盘.CPU.运行内存等 配置自动发现主机:设置ip地址范围,检查类型为zabbix客户端,端口未10050,键值为system.uname,设置唯一性准则为ip地址 ...
- linux 服务器命令
sudo apt-get update sudo apt-get install sudo passwd 123456 设置root密码 su root 切换root用户 netstat -anlp ...