【Javascript】浮点数陷阱

什么是浮点数

简单点理解就是 小数点的位置漂浮不定的数

在计算机中 对于小数的表示我们通常会使用浮点数来存储


3.141 = 3.141 * 10^0
3.141 = 31.41 * 10^-1
3.141 = 314.1 * 10^-2
...

然而 在 JavaScript 中所有数字包括整数和小数都只有一种类型 — Number

在一些数学运算中会出现

// 加法
0.1 + 0.2 = 0.30000000000000004
0.2 + 0.4 = 0.6000000000000001
 
// 减法
1.5 - 1.2 = 0.30000000000000004
0.3 - 0.2 = 0.09999999999999998
 
// 乘法
19.9 * 100 = 1989.9999999999998
9.7 * 100 = 969.9999999999999
 
// 除法 
0.3 / 0.1 = 2.9999999999999996
0.69 / 10 = 0.06899999999999999

 // 比较
 0.1 + 0.2 === 0.3 // false
(0.3 - 0.2) === (0.2 - 0.1) // false

的情况

常用解决方案

Math.js

decimal.js

big.js

最大安全数

最大安全数是指能在JS中不丢失精度的情况下 能表示的最大数字
通过文档我们可以查到 JS中的最大安全数是Number.MAX_SAFE_INTEGER
也就是 2^53-1 = 9007199254740991

如果有比最大安全数大的数字 在JS中的表示 就会出现问题
例如

2**53===2**53+1    //true

在JS中 9007199254740992 和 9007199254740993 居然相等了

据说在淘宝早期的订单系统中把订单号当作数字处理 后来随订单号暴增 已经超过了9007199254740992 最终的解法是把订单号改成字符串处理

这和我之前项目中遇到的那个用户ID问题如出一辙 最后 让后端同事将用户ID转换为字符串 才解决问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值