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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值