数字
number(数字),包括 “整数” 和带小数的十进制数。
JavaScript 中的数字类型是基于 IEEE 754 标准来实现的,该标准通常也被称为“浮点数”。JavaScript 使用的是 “双精度” 格式(即 64 位二进制)。
机器精度
二进制浮点数最大的问题(不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此),会出现如下情况:
0.1 + 0.2 === 0.3; // false
二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们相加的结果并非刚好等于 0.3,而是一个比较接近的数字 0.30000000000000004,所有条件判断结果为 false。
处理以上问题的方法是设置一个误差范围值,通常称为 “机器精度”(machine epsilon),对 JavaScript 的数字来说,这个值通常是 2^-52 (2.220446049250313e-16)。
// ES6 polyfill
if (!Number.EPSILON) {
Number.EPSILON = Math.pow(2,-52);
}
比较两个数字是否相等(在指定的误差范围内):
function numberCloseEnoughToEqual(n1,n2) {
return Math.abs(n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numberCloseEnoughToEqual(a,b); // true
numberCloseEnoughToEqual(0.0000001,0.0000002); // false
特殊的数字
NaN 指 “不是一个数字”(not a number),其实将它理解为 “无效数值” “失败数值” 或者 “坏数值” 可能更准确些。
var a = 2 / "foo"; // NaN
typeof a === "number"; // true
NaN 是一个 “警戒值”,用于指出数字类型中的错误情况,即 “执行数学运算没有成功,这是失败后返回的结果”。
var a = 2 / "foo";
a == NaN; // false
a === NaN; // false
NaN 是一个特殊值,它和自身不相等。
数字
number(数字),包括 “整数” 和带小数的十进制数。
机器精度
二进制浮点数最大的问题(不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此),会出现如下情况:
二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们相加的结果并非刚好等于 0.3,而是一个比较接近的数字 0.30000000000000004,所有条件判断结果为 false。
处理以上问题的方法是设置一个误差范围值,通常称为 “机器精度”(machine epsilon),对 JavaScript 的数字来说,这个值通常是 2^-52 (2.220446049250313e-16)。
比较两个数字是否相等(在指定的误差范围内):
特殊的数字
NaN 指 “不是一个数字”(not a number),其实将它理解为 “无效数值” “失败数值” 或者 “坏数值” 可能更准确些。
NaN 是一个 “警戒值”,用于指出数字类型中的错误情况,即 “执行数学运算没有成功,这是失败后返回的结果”。
NaN 是一个特殊值,它和自身不相等。