二维码

JavaScript Numbers

JavaScript Numbers


JavaScript只有一种数字类型。数字可以带有或不带有小数。


1
2
let x = 3.14;    // A number with decimals  
let y = 3;       // A number without decimals

超大或超小的数字可以用科学(指数)符号书写:

1
2
let x = 123e5;    // 12300000  
let y = 123e-5;   // 0.00123


JavaScript 数字始终是 64 位浮点数

与许多其他编程语言不同, JavaScript 没有定义不同类型的数字,例如整数、短整型、长整型、 浮点数等。

JavaScript 数字始终存储为双精度浮点数 数字,遵循国际 IEEE 754 标准。

此格式 以 64 位存储数字,其中数字(分数)以位 0 存储 到 51,以位 52 到 62 为单位的指数,以及以位 63 为单位的符号:

值(又名分数/尾数) 指数 标志
52 位 (0 - 51) 11 位 (52 - 62) 1 位 (63)

整数精度

整数(没有句点或指数表示法的数字)最多可精确到 15 位。

1
2
let x = 999999999999999;   // x will be 999999999999999  
let y = 9999999999999999;  // y will be 10000000000000000

最大小数位数为 17。

浮动精度

浮点运算并不总是 100% 准确:

1
let x = 0.2 + 0.1;

为了解决上述问题,可以使用乘法和除法:

1
let x = (0.2 * 10 + 0.1 * 10) / 10;


添加数字和字符串

警告!!

JavaScript 使用 + 运算符进行加法和串联。

数字已添加。字符串是连接的。

如果将两个数字相加,结果将是一个数字:

1
2
3
let x = 10;  
let y = 20;
let z = x + y;

如果添加两个字符串,结果将是一个字符串连接:

1
2
3
let x = "10";  
let y = "20";
let z = x + y;

如果添加一个数字和一个字符串,结果将是一个字符串连接:

1
2
3
let x = 10;  
let y = "20";
let z = x + y;

如果添加字符串和数字,则结果将是字符串连接:

1
2
3
let x = "10";  
let y = 20;
let z = x + y;

一个常见的错误是期望此结果为30:

1
2
3
let x = 10;  
let y = 20;
let z = "The result is: " + x + y;

一个常见的错误是期望此结果为 102030:

1
2
3
4
let x = 10;  
let y = 20;
let z = "30";
let result = x + y + z;

JavaScript 解释器从左到右工作。

前 10 + 20 相加,因为 x 和 y 都是数字。

然后 30 + “30” 被连接起来,因为 z 是一个字符串。


数字字符串

JavaScript 字符串可以包含数字内容:

1
2
3
let x = 100;         // x is a number  

let y = "100";       // y is a string

JavaScript 将尝试在所有数值运算中将字符串转换为数字:

这将起作用:

1
2
3
let x = "100";  
let y = "10";
let z = x / y;

这也将起作用:

1
2
3
let x = "100";  
let y = "10";
let z = x * y;

这将起作用:

1
2
3
let x = "100";  
let y = "10";
let z = x - y;

但这行不通:

1
2
3
let x = "100";  
let y = "10";
let z = x + y;

在最后一个示例中,JavaScript 使用 + 运算符来连接字符串。


NaN - 不是一个数字

NaN是一个 JavaScript 保留字,指示数字不是合法数字。

尝试使用非数字字符串进行算术运算将导致(不是 编号):NaN

1
let x = 100 / "Apple";

但是,如果字符串是数字,则结果将是数字:

1
let x = 100 / "10";

您可以使用全局 JavaScript 函数isNaN()来确定值是否不是数字:

1
2
let x = 100 / "Apple";  
isNaN(x);

注意NaN。如果在数学运算中使用NaN,结果也将为NaN

1
2
3
let x = NaN;  
let y = 5;
let z = x + y;

或者结果可能是像NaN5这样的串联:

1
2
3
let x = NaN;  
let y = "5";
let z = x + y;

NaN是一个数字:typeof NaN返回number

1
typeof NaN;


无限

Infinity(或 -Infinity)是当您计算的数字超出最大可能数字时 JavaScript 将返回的值

1
2
3
4
5
let myNumber = 2;  
// Execute until Infinity
while (myNumber != Infinity) {
  myNumber = myNumber * myNumber;
}

除以 0(零)也会生成无穷大:

1
2
let x =  2 / 0;  
let y = -2 / 0;

Infinity是一个数字:typeof Infinity返回number

1
typeof Infinity;


十六进制

如果数字常量前面有 0x,JavaScript 会将其解释为十六进制。

1
let x = 0xFF;

切勿用前导零写数字(如 07)。
某些 JavaScript 版本解释 数字为八进制,如果它们用前导零书写。

默认情况下,JavaScript 将数字显示为以 10 为基数的小数。

但是您可以使用toString()方法输出从基数 2 到基数 36 的数字。

十六进制是以 16 为基数。十进制是以 10 为基数。 八进制是以 8 为基数。二进制是以 2 为基数

1
2
3
4
5
6
7
let myNumber = 32;  
myNumber.toString(32);
myNumber.toString(16);
myNumber.toString(12);
myNumber.toString(10);
myNumber.toString(8);
myNumber.toString(2);


JavaScript 数字作为对象

通常,JavaScript 数字是从文字创建的原始值:

1
let x = 123;  

但数字也可以用关键字new定义为对象:

1
2
let y = new Number(123);  
let x = 123;
1
2
let x = 123;  
let y = new Number(123);

不要创建 Number 对象。

new关键字使代码复杂化并减慢执行速度。

数字对象可能会产生意想不到的结果:

使用运算符时,x 和 y 相等==

1
2
let x = 500;  
let y = new Number(500);

使用运算符时,x 和 y 不相等===

1
2
let x = 500;  
let y = new Number(500);

请注意(x==y)(x===y)之间的区别。

(x == y)对还是错?

1
2
let x = new Number(500);  
let y = new Number(500);

(x === y)对还是错?

1
2
let x = new Number(500);  
let y = new Number(500);

比较两个 JavaScript 对象总是返回 false