遇到的问题:

  后端返回的订单号是整型的,超过了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长整型的失真问题解决的更多相关文章

  1. javascript没有长整型

    记录一下前几天踩坑的经历. 背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了 奇怪的地方主要有以下几点: 项目在测试环境才会这样,在本机能够正常运行,多次重 ...

  2. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  3. Python基础:数值(布尔型、整型、长整型、浮点型、复数)

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  4. Java把长整型时间转成字符串日期

    数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...

  5. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  6. JAVA 长整型转换为IP地址的方法

    JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...

  7. Long.parseLong(String s) 其中s必须是数字形式的字符串,才能运用该函数转化为长整型。

    public class ConverTo { public static void main(String [] args) { String numberIn =args[0]; convertN ...

  8. php长整型完整输出

    今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报 ...

  9. PHP长整型在32位系统中强制转化溢出

    CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机 ...

随机推荐

  1. Vue2.5学习路线及基础知识总结。

    在接触新技术不了解时,我喜欢去慕课网上看新手教程,在学习vue时,在慕课网上看了几个老师的视频,发现这挺好,讲到挺详细的,适合新手,有兴趣的可以先看一下,vue2.5入门教程. 然后在学习路上看见了一 ...

  2. 详细说明进程管理工具htop、vmstat等相关命令

    htop htop是一款运行于Linux系统监控与进程管理软件,用于取代Unix下传统top.与top只提供最消耗资源进程列表不同,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存 ...

  3. Linux系统安装IonCube的方法详解教程

    ioncube是业内优秀的php加密解密解决方案.和zend guard相比,ioncube具有如下优势: 1. 安全:zend guard的版本不是非常安全,网络上有破解使用zend,下面我们来看I ...

  4. vue添加class类名

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  5. c#实现识别图片上的验证码数字

    这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  6. C#利用for循环打印图形练习题

    (1) namespace ConsoleApp2 { class Program { static void Main(string[] args) { ; i < ; i++)//外层循环控 ...

  7. Handlebars.js registerHelper

    Handlebars.registerHelper('link', function (text, url) { text = Handlebars.Utils.escapeExpression(te ...

  8. Ubuntu16.04下安装elasticsearch+kibana实现php客户端的中文分词

    1.下载安装java, elasticsearch和kibana apt-get install default-jre default-jdk wget https://artifacts.elas ...

  9. Javascript神器之webstorm

    推荐个编辑器主题下载的一个网站. Color Themes    网址:http://color-themes.com [点这里直接跳转] 但是,只支持几个编辑器. 各种颜色搭配的主题,随你选择!我个 ...

  10. 黄聪:C#中CefSharp的简单使用

    C#中CefSharp的简单使用 https://blog.csdn.net/qq_26712977/article/details/78282995