Number.EPSILON

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

对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的-52 次方。

  1. Number.EPSILON === Math.pow(2, -52)
  2. // true
  3. Number.EPSILON
  4. // 2.220446049250313e-16
  5. Number.EPSILON.toFixed(20)
  6. // "0.00000000000000022204"

Number.EPSILON实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。

  1. 0.1 + 0.2
  2. // 0.30000000000000004
  3. 0.1 + 0.2 - 0.3
  4. // 5.551115123125783e-17
  5. 5.551115123125783e-17.toFixed(20)
  6. // '0.00000000000000005551'

上面代码解释了,为什么比较0.1 + 0.20.3得到的结果是false

  1. 0.1 + 0.2 === 0.3 // false

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

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

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

  1. function withinErrorMargin (left, right) {
  2. return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
  3. }
  4. 0.1 + 0.2 === 0.3 // false
  5. withinErrorMargin(0.1 + 0.2, 0.3) // true
  6. 1.1 + 1.3 === 2.4 // false
  7. withinErrorMargin(1.1 + 1.3, 2.4) // true

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

Number.EPSILON相关推荐

  1. js 中的 number 为何很怪异

    js 中的 number 为何很怪异 声明:需要读者对二进制有一定的了解 对于 JavaScript 开发者来说,或多或少都遇到过 js 在处理数字上的奇怪现象,比如: > 0.1 + 0.2 ...

  2. html number方法,JavaScript Number 对象

    JavaScript Number 对象 JavaScript 只有一种数字类型. 可以使用也可以不使用小数点来书写数字. JavaScript 数字 JavaScript 数字可以使用也可以不使用小 ...

  3. Javascript 对象二(Number、String、Boolean、Array、Date、Math、RegExp)

    Javascript 对象二(Number.String.Boolean.Array.Date.Math.RegExp) Number 数字 对象 String 字符串 对象 Boolean 布尔 对 ...

  4. JS Number对象常用函数(数字类型常用函数)

    Number 属性 属性 描述 Number.MAX_VALUE 最大值 Number.MIN_VALUE 最小值 Number.NaN 非数字 Number.NEGATIVE_INFINITY 负无 ...

  5. Js中Number对象

    Js中Number对象 JavaScript的Number对象是经过封装从而能够处理数字值的对象,Number对象由Number()构造器以及字面量声明的值在转化为包装对象时创建,JavaScript ...

  6. javascript Number object

    属性 属性 描述 Number.MAX_VALUE The largest representable number (±1.7976931348623157e+308) Number.MIN_VAL ...

  7. js 中的 number 为何很怪异 1

    js 中的 number 为何很怪异 声明:需要读者对二进制有一定的了解 对于 JavaScript 开发者来说,或多或少都遇到过 js 在处理数字上的奇怪现象,比如: > 0.1 + 0.2 ...

  8. ES6-11数值扩展:二进制和八进制、数值分隔符、Number.isFinite()、Number.isNaN()等

    1. 二进制和八进制 用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 // true// 非严格模式 (function ...

  9. 《你不知道的JavaScript(中卷)》读后笔记 —— JavaScript中“Number”的冷门知识点

    目录 1. Number.EPSILON 2. 整数的安全范围(Number.MAX_SAFE_INTEGER.Number.MIN_SAFE_INTEGER) 3. 整数检测(Number.isIn ...

  10. JavaScript中string与number

    JavaScript中string与number string字符串 将一个值使用'单引号或者"双引号,引用起来就是字符串. ES6提供了反引号定义一个字符串,可以支持多行,还支持插值. l ...

最新文章

  1. json qbytearray 串 转_如何通过QByteArray在JSON中存储QPixmap?
  2. 南京秦淮灯会亮灯迎春 明城墙内外“飘”年味
  3. python sqlite3更新数据,python sqlite3-使用f字符串更新数据库函数
  4. tomcat启动startup.bat一闪而过 全面解决,大佬牛逼,转载
  5. 编译原理实验报告_任意给定一个正规式 r (包括连接、或、闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N 。
  6. Java IO: 序列化与ObjectInputStream、ObjectOutputStream
  7. python常用算法包_Python中常用的包--sklearn
  8. 【转】Java 项目UML反向工程转化工具
  9. python| map()函数应用详解
  10. Android 中关于Cursor类的介绍
  11. 【Python精彩案例】随拍文档转PDF扫描版
  12. 网络协议篇之CWMP协议(二)—— CWMP(TR-069)业务流程
  13. SGD,Momentum,优化算法原理及实现
  14. 在计算机领域黑箱,计算机模拟电学黑箱
  15. 点亮LED灯——arduino 学习第一天
  16. 内卷失败:敲了 10000 小时代码,我也没能成为一名高级程序员
  17. Q/W防洪跳转页面/微信小程序跳转到未备案域名
  18. 网络模型可视化工具-netron
  19. 致自己,时时需要修炼内功
  20. 一文读懂阿里云挑战 AWS 的底气 | 2018•大复盘

热门文章

  1. 电脑系统常用的10个快捷键,适合电脑新用户看看
  2. OLED显示模块驱动原理及应用
  3. html页面字体缩小模糊怎么解决,ps字体模糊怎么变清晰 设置一下字体大小,是否一样...
  4. 基于神经网络的车牌识别系统
  5. css3 箭头动态效果,CSS3制作上下跳动动画箭头效果
  6. css画横线箭头_如何用纯CSS实现的箭头的效果?
  7. 墨刀原型设计工具学习体会——临摹网易云音乐App
  8. 跟着团子学SAP PS:项目版本管理-项目模拟功能(CJV1/CJV2/CJV3/CJV4)
  9. 获取mac最高root权限登录系统
  10. sed替换字符串(变量)