Skip to content

JavaScript深入系列之数字 #7

Description

@archerU

数字

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 是一个特殊值,它和自身不相等。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions