什么是浮点数
简单点理解就是 小数点的位置漂浮不定的数
在计算机中 对于小数的表示我们通常会使用浮点数来存储
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转换为字符串 才解决问题