JavaScript 中的长整型精度问题

简介: JavaScript 中的长整型精度问题

JavaScript 在处理长整型时会有一定的问题,有时精度会缺失。

问题

当 Java 后台有个 Long 型值20175678901234567转到前台时,发现精度存在问题:

var batchNumber = 20175678901234567;  
console.log(batchNumber);  // 20175678901234570

也就是说,到了前端 JavaScript 接收后,值变成了20175678901234570

原理

JavaScript 中所有的数字类型,实际存储都是通过 8 字节 double 浮点型 表示的。浮点数并不是能够精确表示范围内的所有数的, 虽然 double 浮点型的范围看上去很大: 2.23x10^(-308) ~ 1.79x10^308。 可以表示的最大整数可以很大,但能够精确表示,使用算数运算的并没有这么大。

比如,简单的加法运算,结果也是出人意料:

var x = 0.2;  
var y = 0.1;  
console.log(x+y);  // 0.30000000000000004

JavaScript 有所谓的最大和最小安全值:

console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991

在安全值范围内的整形都能够正常显示,超出安全值范围的整型则结果都是错误的结果, 因为它们进行的都是浮点数运算会丢失精度,都不可靠。

console.log(Number.MAX_SAFE_INTEGER + 2);  // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER + 2000);  // 9007199254742992

解决方案

直接将JavaScript 中的长整型以字符串形式来表示就不会有精度问题:

var batchNumberStr = '20175678901234567';  
console.log(batchNumberStr);  // 20175678901234567

对于 Node.js 来说,也有一些开源库 bignumbigint的等对于长整型的支持。

相关文章
|
20天前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
20 1
JavaScript中的原型 保姆级文章一文搞懂
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
101 2
|
16天前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
15 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
140 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
85 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
76 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
97 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp宿舍管理系统的附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp宿舍管理系统的附带文章源码部署视频讲解等
86 3
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的家政平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的家政平台附带文章源码部署视频讲解等
66 3
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物医院系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物医院系统附带文章源码部署视频讲解等
59 2