https://github.com/mqyqingfeng/Blog/issues/155
https://time.geekbang.org/column/article/78884
ECMAScript 使用 64 位字节来储存一个浮点数

  1. console.log( 0.1 + 0.2 == 0.3); // false

原因: 浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值
正确写法:检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法

  1. console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); // true

10.出现小数精度丢失的原因(0.2+0.1≠0.3)?

  1. 0.1 + 0.2 != 0.3 // true
  2. 9999999999999999 == 10000000000000001 // true
  3. 1.335.toFixed(2) // 1.33

原因:js中一般的数值是以64位浮点数存储在内存中的。
精度丢失过程:转换为二进制 -> 转换为二进制指数格式 -> 提取数据,进行数值截取,导致精度丢失
解决: 比如math.js,decimal.js,D.js等数学库
1.把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)
2.运算结果不超过 Math.pow(2, 53) 就不会丢失精度
3.修复fixed

  1. function toFixed(num, s) {
  2. var times = Math.pow(10, s)
  3. var des = num * times + 0.5
  4. des = parseInt(des, 10) / times
  5. return des + ''
  6. }

11.JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法?

Math.pow(2, 53) 9007199254740992
Number.MAX_SAFE_INTEGER 9007199254740991
Number.MAX_VALUE 1.7976931348623157e+308