JavaScript的高精度计算与JSON.parse的BIGINT
在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相关推荐
- JSON.stringify() / JSON.parse()
JSON.stringify() 这个方法可以把javascript对象转换成json字符串. JSON.parse() 这个方法可以把 json 字符串转换成 javascript对象. [下面来看 ...
- JSON学习笔记(四)- JSON.parse()
JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象. 语法 JSON ...
- JSON(4)---JSON.parse()
JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象. 语法 JSON ...
- 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 使用步骤 ...
- JSON.parse()
概述 JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法 JSON.par ...
- javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案
JavaScript 精度的问题时不时就会出现在前端开发面前,这里讨论的是大数精度丢失的问题 问题复现 前端向服务端请求某个订单数据,其中订单号 18 位,在数据库中以数字的形式保存,服务端查询数据库 ...
- javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())...
javascript 数组和对象的浅度复制和深度复制 在平常我们用 '='来用一个变量引用一个数组或对象,这里是'引用'而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3, ...
- JavaScript 中 JSON.parse()和JSON.stringify()
为什么80%的码农都做不了架构师?>>> 函数 描述 JSON.parse() 用于将一个 JSON 字符串转换为 JavaScript 对象. JSON.stringify( ...
- 将JSON格式数据转换为javascript对象 JSON.parse()
<html> <body> <h2>通过 JSON 字符串来创建对象</h3> <p> First Name: <span id=&q ...
最新文章
- MemberShip驗證
- 如何从旧提交创建新的Git分支? [重复]
- PHP——分页显示数据库内容
- pythondifflib详解_用python标准库difflib比较两份文件的异同详解
- 【Git】GitHub同名项目实现丰富多彩的README.md
- anaconda python下载_anaconda3下载 anaconda python 3.7 for Win64 v2019.10 官方安装免费版 下载-脚本之家...
- ffmpeg之G711解析成pcm
- 密码生成的思路---电脑mac地址
- Linux启动时 Error 15: File not found 问题解决方法
- Java软件开发工程师级别
- 麻将判断胡牌 java_麻将胡牌逻辑 java
- 联通短信息中心号码,联通服务中心号码速查
- 在Java web页面使用ECharts制作图表
- 基于java学生签到考勤系统
- LocalDateTime用法
- 七夕祭( Poetize系列)
- 有理数加法 (15 分)
- 项链(牛客竞赛2020-普及组第四场-T4)
- 基础五:光的量子纠缠
- 算法训练 大等于n的最小完全平方数 python
热门文章
- 【推荐】50份2021年稀土开发者大会(PPT汇总)
- NOAUTH Authentication required
- 《考虑车辆运动约束的最优避障轨迹规划算法》论文解读二
- javadoc的用法
- 数据结构中运算描述(定义)与运算实现的异同
- 【spring框架28】spring之packagesToScan
- Verilog 刷题-Dff8r
- 在uniapp中实现微信分享功能(分享给好友+朋友圈+收藏)
- Image Not Found VOCdevkit\images\train\000000.jpg
- RecyclerView最后一条显示不全或显示部分的问题解决