在JavaScript处理整数的时候会遇到某些特别奇怪的问题,比如后台给你返回了一个超长的数字,然后js在计算的时候突然发现计算不对,不是后面为0就是计算得不到想要的结果.这里涉及到一个很简单的知识 也就是NUMBER的安全整数.

Number安全整数

Number.MAX_SAFE_INTEGER // 9007199254740991
9007199254740991 2 // 9007199254740992

首先我们拿到了安全范围内的数字 然后对他进行简单的加法,正常的结果应该是9007199254740993 但是这里的尾数只有2, 大家可以去测试一下也是挺有意思的。因为js中所有的整数都是用浮点类型(double-precision 64-bit binary format IEEE 754 value)导致的,虽然可以承受的范围比较大,但是计算精度却不怎么好

计算精度

说完了安全整数这里来简单说说计算精度

0.1 0.2 //0.30000000000000004

原理也是同上 那么解决办法也很简单

使用math.js库即可解决

// prevent round-off errors showing up in output
var ans = math.add(0.1, 0.2);       //  0.30000000000000004
math.format(ans, {precision: 14});  // '0.3'

JSON.parse中遇到的BIGINT

比较常见的场景为后台返回了一串JSON但是数字为BIGINT导致解析错误,一般为16位

var c='{"num": 90071992547409999}'
JSON.parse(c) // {num: 90071992547410000}

比如我们使用jQuery的ajax开启了json:true功能 jQuery会自动parse 这样的话会造成精度不够的问题,所以这里可以使用

json-bigint
var JSONbig = require('json-bigint');var json = '{ "value" : 9223372036854775807, "v2": 123 }';
console.log('Input:', json);
console.log('');console.log('node.js bult-in JSON:')
var r = JSON.parse(json);
console.log('JSON.parse(input).value : ', r.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r));console.log('\n\nbig number JSON:');
var r1 = JSONbig.parse(json);
console.log('JSON.parse(input).value : ', r1.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSONbig.stringify(r1));// outputInput: { "value" : 9223372036854775807, "v2": 123 }node.js bult-in JSON:
JSON.parse(input).value :  9223372036854776000
JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}big number JSON:
JSON.parse(input).value :  9223372036854775807
JSON.stringify(JSON.parse(input)): {"value":9223372036854775807,"v2":123}

如果不想要引入额外的库则可以参考这段函数

let stringedJSON = origJSON.replace(/:\s*([- Ee0-9.] )/g, ': "uniqueprefix$1"');let o = JSON.parse(stringedJSON, (key, value) => {// only changing stringsif (typeof value !== 'string') return value;// only changing number stringsif (!value.startsWith('uniqueprefix')) return value;// chop off the prefixvalue = value.slice('uniqueprefix'.length);// pick your favorite arbitrary-precision libraryreturn new Big(value);
});

参考文献

  • stackoverflow
  • json-bigint
  • ecma-262/5.1

更多专业前端知识,请上 【猿2048】www.mk2048.com

JavaScript的高精度计算与JSON.parse的BIGINT相关推荐

  1. JSON.stringify() / JSON.parse()

    JSON.stringify() 这个方法可以把javascript对象转换成json字符串. JSON.parse() 这个方法可以把 json 字符串转换成 javascript对象. [下面来看 ...

  2. JSON学习笔记(四)- JSON.parse()

    JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象. 语法 JSON ...

  3. JSON(4)---JSON.parse()

    JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象. 语法 JSON ...

  4. JSON.stringify() / JSON.parse() / JSON 真是个好东西

    目录 1. JSON 基本概念 1.1 JavaScript 对象表示法 1.2 JSON 文件 1.3 JSON 语法 2. XML VS JSON 2.1 共同点 2.2 不同点 2.3 使用步骤 ...

  5. JSON.parse()

    概述 JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法 JSON.par ...

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

    JavaScript 精度的问题时不时就会出现在前端开发面前,这里讨论的是大数精度丢失的问题 问题复现 前端向服务端请求某个订单数据,其中订单号 18 位,在数据库中以数字的形式保存,服务端查询数据库 ...

  7. javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())...

    javascript 数组和对象的浅度复制和深度复制 在平常我们用 '='来用一个变量引用一个数组或对象,这里是'引用'而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3, ...

  8. JavaScript 中 JSON.parse()和JSON.stringify()

    为什么80%的码农都做不了架构师?>>>    函数 描述 JSON.parse() 用于将一个 JSON 字符串转换为 JavaScript 对象. JSON.stringify( ...

  9. 将JSON格式数据转换为javascript对象 JSON.parse()

    <html> <body> <h2>通过 JSON 字符串来创建对象</h3> <p> First Name: <span id=&q ...

最新文章

  1. MemberShip驗證
  2. 如何从旧提交创建新的Git分支? [重复]
  3. PHP——分页显示数据库内容
  4. pythondifflib详解_用python标准库difflib比较两份文件的异同详解
  5. 【Git】GitHub同名项目实现丰富多彩的README.md
  6. anaconda python下载_anaconda3下载 anaconda python 3.7 for Win64 v2019.10 官方安装免费版 下载-脚本之家...
  7. ffmpeg之G711解析成pcm
  8. 密码生成的思路---电脑mac地址
  9. Linux启动时 Error 15: File not found 问题解决方法
  10. Java软件开发工程师级别
  11. 麻将判断胡牌 java_麻将胡牌逻辑 java
  12. 联通短信息中心号码,联通服务中心号码速查
  13. 在Java web页面使用ECharts制作图表
  14. 基于java学生签到考勤系统
  15. LocalDateTime用法
  16. 七夕祭( Poetize系列)
  17. 有理数加法 (15 分)
  18. 项链(牛客竞赛2020-普及组第四场-T4)
  19. 基础五:光的量子纠缠
  20. 算法训练 大等于n的最小完全平方数 python

热门文章

  1. 【推荐】50份2021年稀土开发者大会(PPT汇总)
  2. NOAUTH Authentication required
  3. 《考虑车辆运动约束的最优避障轨迹规划算法》论文解读二
  4. javadoc的用法
  5. 数据结构中运算描述(定义)与运算实现的异同
  6. 【spring框架28】spring之packagesToScan
  7. Verilog 刷题-Dff8r
  8. 在uniapp中实现微信分享功能(分享给好友+朋友圈+收藏)
  9. Image Not Found VOCdevkit\images\train\000000.jpg
  10. RecyclerView最后一条显示不全或显示部分的问题解决