较小的数值

JavaScript只有一种数值类型:number(数字)。JavaScript没有真正意义上的整数,这也是它一直以来为人诟病的地方。JavaScript中的“整数”就是没有小数的十进制数。所以 42.0 即等同于 “整数”42。

JavaScript 中的数字类型是基于 IEEE754 标准来实现的,该标准通常也被称为“浮点数”。JavaScrip 使用的是 “双精度” 格式(即 64 位二进制)

二进制浮点数最大的问题 (不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此),会出现如下情况

0.1 + 0.2 === 0.3 // false

简单来说,二进制浮点数中的 0.1 和 0.2 并不是十分精确,他们相加的结果并非刚好等于 0.3,而是一个比较接近的数值 0.30000000000000004, 所以条件判断结果为 false

最常见的方法是设置一个误差范围值,通常称为“机器精度(nacinne epsilon)”,对 JavaScript的数值来说,这个值通常是 2^-52(2.220446049250313e-16)

从 ES6 开始,这个值定义在 Number.EPSILON

ES6之前的 polyfill:

if (!Number.EPSILON) {
  Number.EPSILON = Math.pow(2, -52)
}

可以使用 Number.EPSILON 来比较两个数值是否相等

function numbersCloseEnoughToEqual(n1, n2) {
   return Math.abs(n1 - n2) < Number.EPSILON
}

let a = 0.1 + 0.2
let b = 0.3

numbersCloseEnoughToEqual(a, b) // true

能够呈现的最大浮点数大约是 1.798e+308,它定义在 Number.MAX_VALUE
最小的浮点数大约是 5e-324,他不是负数,但是无限接近与0,定义在 Number.MIN_VALUE

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。 ...
    oWSQo阅读 1,747评论 0 0
  • 所有内容基于阮一峰的ECMAScript 6 入门 1.二进制和八进制表示法 ES6提供了二进制和八进制数值的新的...
    我才不是稻草人阅读 2,607评论 0 0
  • 二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。 从...
    陈老板_阅读 3,401评论 0 1
  • 1. 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)...
    焦迈奇阅读 2,865评论 0 0
  • 一、数值的扩展 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。十六进制...
    夜幕小草阅读 2,600评论 0 1

友情链接更多精彩内容