JavaScript 中有两种不同的数字:数字和“bigints”。
数字最常用,表示双精度 64 位浮点格式的数值数据类型。
number:双精度 64 位浮点格式(IEEE 754)的数值数据类型。例如 -6、-2.4、0、0.1、1、3.14、16.984025、25、976、1024.0 和 500000。bigint:能以任意精度格式表示_整数_的数值数据类型。例如 -12n、0n、4n 和 9007199254740991n。let numericValue = 42;
// => 42
JavaScript 代码中像 42 这样的数字字面量是浮点值,不是整数。日常使用中并没有单独的整数类型。bigint类型的设计目的不是在日常使用中取代number类型。42仍然是Number,不是BigInt。
数字也可以用 0b101、0o13、0x0A 这样的字面量形式表示。要了解更多关于数字词法语法的内容,请参见这里。
E 表示法表示一个需要乘以 10 的指定次幂的数字。E 表示法的格式是:先写一个数字,后面跟 e 或 E,再跟上要乘的 10 的次幂。
const num = 3.125e7;
// => 31250000
// The notation essentially says, "Take 3.125 and multiply it by 10^7".
E 表示法也可以用来表示非常小的数字:
const num = 325987e-6; // Equals 0.325987
// The notation essentially says, "Take 325987 and multiply it by 10^-6.
下划线可以让大数字更容易阅读。编译器会完全忽略这些下划线。
const num = 1_000_000; // You can read this as 1,000,000
console.log(num);
// => 1000000
处理数字时,有两个内置对象很有用:
Math还包含对数字取整的方法。关于可用的取整选项,可以阅读这篇 javascript.info 上关于取整的文章。
Math.floor(234.34); // => 234
Math.ceil(234.34); // => 235
内置的全局object Number 同时也是一个全局function,可以用来把_几乎任何_类似数字的东西转换成number。它不像把string_解析_成number那样宽容。
const date = new Date('December 17, 1995 03:24:00');
const unix = Number(date);
unix;
// => 819199440000
JavaScript 中的数字有三类最大值(以及最小值 / 最大负值):
VALUE:由Number.MAX_VALUE和Number.MIN_VALUE给出INFINITY:由Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY给出SAFE_INTEGER:由Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER给出由于 JavaScript 中数字的实现方式,Number.MIN_VALUE和Number.MAX_VALUE之间的数字并非全都能表示。不过,Number.MIN_SAFE_INTEGER - 1和Number.MAX_SAFE_INTEGER + 1之间的_每一个_数字都能表示。
JavaScript 有几个特殊的数字值:
NaN和Infinity。+0和-0。错误值NaN(也叫“非数字”)会在以下情况中产生。
Number('123'); // => 123
Number('Hello, World!'); // => NaN
Math.sqrt(-64); // => NaN
NaN + 69; // => NaN
NaN是唯一不等于自身的值:
NaN === NaN; // => false
如果想检查某个值是否为NaN,就必须使用全局函数isNaN():
isNaN(NaN); // => true
isNaN(123); // => false
Infinity是一个错误值,表示以下两种问题之一:
Math.pow(2, 1024); // => Infinity
6 / 0; // => Infinity
-6 / 0; // => -Infinity
Infinity比任何其他数字都大(NaN除外)。同样,-Infinity比任何其他数字都小(NaN除外)。
全局函数isFinite()可以检查某个值是否是真正的数字(既不是无穷大,也不是NaN):
isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false
+0和-0在 JavaScript 中是两个不同的数字。当你表示的数字小到与 0 无法区分时,就可能产生它们。带符号的零让你可以记录自己是从“哪个方向”趋近零的,也就是这个数字在被视为零之前带什么符号。最佳实践是假装只有一个零。
如果两个数字的值相同,就认为它们相等。
1 == 1.0;
// => true
1 === 1.0;
// => true
// Remember, all numbers are floating-points, so this is
// different syntax for the exact same value.
1 === 1n;
// => false
// Strictly checking a number against a bigint will always result
// in false.
关于一般的比较以及在 JavaScript 中比较数值的更多信息,请参见比较。
由于 JavaScript 中的数字是浮点数,对这些值进行的所有数学运算都是浮点运算。因此,在 JavaScript 中:
0.1 + 0.2 === 0.3;
// => false
简要说明请参见 0.30000000000000004.com,深入说明请参见 Oracle Numerical Computation Guide 的附录 D:“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。