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