zoukankan      html  css  js  c++  java
  • 为什么JavaScript里面0.1+0.2 === 0.3是false

    以下这一篇说明的很详细:彻底理解0.1 + 0.2 === 0.30000000000000004的背后

    0.1+0.2 === 0.3 //返回是false, 这是为什么呢??

    我们知道浮点数计算是不精确的,上面的返回式实际上是这样的:
    0.1 + 0.2 = 0.30000000000000004

    0.1 + 0.2 - 0.3 = 5.551115123125783e-17

    5.551115123125783e-17.toFixed(20) = '0.00000000000000005551'

    在JavaScript的新规范ES6加入了一个新的东西-->Number.EPSILON

    Number.EPSILON是在Number对象上面,新增一个极小的常量。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

    对于 64 位浮点数(double)来说,大于 1 的最小浮点数相当于二进制的 1.00..001 ,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的-52 次方。
    Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

    引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。

    好了,我们来解决上面的浮点数计算的问题:

    Number.EPSILON 可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

    5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true

    因此, Number.EPSILON 的实质是一个可以接受的最小误差范围。

    
    function withinErrorMargin (left, right) {
        return Math.abs(left - right) &lt; Number.EPSILON * Math.pow(2, 2);
    }
    
    

    0.1 + 0.2 === 0.3 // false
    withinErrorMargin(0.1 + 0.2, 0.3) // true

    1.1 + 1.3 === 2.4 // false
    withinErrorMargin(1.1 + 1.3, 2.4) // true

    上面的代码为浮点数运算,部署了一个误差检查函数。


    文章引用自ES6标准。

    原文地址:https://segmentfault.com/a/1190000016884479

  • 相关阅读:
    miniNExT
    使用ExaBGP发送BGP路由信息和清洗DDoS流量
    HTML day02(html列表与菜单的制作)
    HTML day01基础总结
    SSH项目整合基本步骤
    常见异常类有哪些?
    JSP 生命周期
    HTTP状态码
    使用oracle删除表中重复记录
    Oracle三种分页?
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9903699.html
Copyright © 2011-2022 走看看