fat-cat

roundOff

摘自 js 中对 0.1 + 0.2 的理解

概念

十进制小数转换为二进制小数

解析

0.1.toString(2) // "0.0001100110011001100110011001100110011001100110011001101"

0.2.toString(2) // 0.001100110011001100110011001100110011001100110011001101

0.1 + 0.2 = 0.30000000000000004 // 15 个 0

一个简单的解决思路

在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

  Math.formatFloat = function (f, digit) {
      // Math.pow(指数,幂指数)
      var m = Math.pow(10, digit);
      // Math.round() 四舍五入
      return Math.round(f * m, 10) / m;
    }
    console.log(9.12 * 100);  // 911.9999999999999
    console.log(Math.formatFloat(9.12 * 100, 2));  // 9.12

总结

可以看到,当十进制小数的二进制表示的有限数字超过 52 位时,在 JS 里是不能精确存储的,这时候就存在舍入误差(Round-off error)