较小的数值

2020-03-08  本文已影响0人  了凡和纤风

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

上一篇下一篇

猜你喜欢

热点阅读