2-js判断浮点数相等

本文最后更新于:2021年2月15日 晚上

某2020前端互助群的每周议题(三) Part 1

原理:

  1. 非是ECMAScript 独有,基于IEEE754 设计的语言都有这个毛病,如CJava
  2. IEEE754 标准中 64 位的储存格式,比如 11 位存偏移值
  3. 其中涉及的三次精度丢失
    • 使用浮点数表示0.1
    • 使用浮点数表示0.2
    • 使用浮点数表示运算后(0.1+0.2)的值

实现

  1. toFixed() + parseFloat()

    /**
     * @param {Number} num 待处理的数
     * @param {Number} len 小数点后保留位数
     */
    function epsEqu(num, len = 10){
        return parseFloat(num.toFixed(len))
    }
    console.log(epsEqu(0.1 + 0.2) === 0.3) // true
  1. toPrecision() + parseFloat()

    注意与toFixed的细微差别(参数范围)

    /**
     * @param {Number} num 待处理的数
     * @param {Number} len 返回的浮点数位数
     */
    function epsEqu(num, len = 10){
        return parseFloat(num.toPrecision(len))
    }
    console.log(epsEqu(0.1 + 0.2) === 0.3) // true
  2. 利用Number.EPSILON

    MDN解释

    Number.EPSILON 属性表示 1 与Number可表示的大于 1 的最小的浮点数之间的差值。

    你不必创建一个 Number 对象来访问这个静态属性(直接使用 Number.EPSILON)。

    EPSILON 属性的值接近于 2.2204460492503130808472633361816E-16,或者 2-52。

    function epsEqu(a, b) {
        return Math.abs(a - b) < Number.EPSILON ? true : false
    }
    
    console.log(epsEqu(0.1 + 0.2, 0.3)) // true

    然后。。。这个方法有缺点

    console.log(epsEqu(1.1 + 1.3, 2.4)) // false
  3. 处理浮点数运算的库:math.js

参考资料

[未知]如何判断 0.1 + 0.2 与 0.3 相等? #10

JS基础测试47期 #74

Number.EPSILON

JavaScript 浮点数运算的精度问题


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!