外观
JS 精度
作者:guo-zi-xin
更新于:1 个月前
字数统计:357 字
阅读时长:1 分钟
场景复现
javascript
0.1 + 0.2 === 0.3 // false1/3 是个无限循环,计算机存储后再取出时就会出现精度丢失问题
计算原理
JS内部计算都是以二进制进行的
整数部分
整数部分是 除 2 取余 + 逆序排列
小数部分
小数部分是 乘 2 取整 + 顺序排序
Number类型存储
Number类型使用IEE754 标准 64位存储
双精度浮点数(double)
为每个树脂分配64位存储空间,以科学计数法的方法存储
科学计数法: 1.xxxxxxx * 2 ^ n
IEEE 753 标准64位存储
0.1的存储
0.1 + 0.2过程
解决方案
parseFloat(num.toPrecision) 理论上用有限的空间来存储无限的小数是不可能保证精确的,但是我们可以处理一下得到期望的结果。
当拿到1.400000000001 这样的数据要展示时,建议使用toPrecision凑整并parseFloat转成数字后再显示,如下
javascript
parseFloat(1.4.toPrecision(12)) === 1.4 // true