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的等对于长整型的支持。

相关文章
|
1月前
|
存储 安全 JavaScript
JavaScript 中整数的安全范围
JavaScript 中整数的安全范围
25 3
|
1月前
|
存储 前端开发 JavaScript
【JavaScript】浮点数精度问题
浮点数精度问题是指在计算机中使用二进制表示浮点数时,由于二进制无法精确表示某些十进制小数,导致计算结果可能存在舍入误差或不精确的情况。 这个问题主要源于浮点数的存储方式。在计算机中,浮点数通常使用IEEE 754标准来表示。该标准将浮点数分为符号位、指数位和尾数位,使用科学计数法来表示一个浮点数。
56 0
|
1月前
|
JavaScript 前端开发
JavaScript中科学计数法转化为数值字符串形式
JavaScript中科学计数法转化为数值字符串形式
|
1月前
|
存储 JavaScript 前端开发
浮点数不再神秘:JS浮点数精度详解
浮点数不再神秘:JS浮点数精度详解
|
11月前
|
JavaScript 前端开发 安全
在 JavaScript 中将浮点数转换为整数
在 JavaScript 中将浮点数转换为整数
156 0
|
存储 JavaScript 前端开发
JavaScript 数值始终是 64 位的浮点数
JavaScript 数值始终是 64 位的浮点数
66 0
|
JavaScript 前端开发
JavaScript 只有一种数值类型。
JavaScript 只有一种数值类型。
57 0
|
存储 JavaScript 前端开发
JavaScript中的Null+浮点数你了解多少?
JavaScript中的Null+浮点数你了解多少?
132 0
|
JavaScript 前端开发 Java
『JavaScript』数据类型转换和运算符
parseInt() 方法 使用 parseInt() 方法,参数为字符串,结果为该字符串转换而来的整数; 转化规则是:如果字符串的首字符不是一个数字,转换失败,返回 NaN;否则,转换到字符串中第一个不是数字的字符止,即,遇到字母、小数点下划线等字符立即停止转换。需要注意的是,16 进制的符号 0x 不会让转换停止。parseInt() 还可以有第二个参数,表示待转换字符串的进制。下面给一些例子:
151 0
|
JavaScript 前端开发
javascript生成n至m的随机整数
javascript生成n至m的随机整数

热门文章

最新文章