JavaScript数字



JavaScript的只有一种类型的数字.

数字可以有也可以没有小数.


JavaScript中的数字

JavaScript 数字可以有也可以没有小数:

var x = 34.00;    // A number with decimals
var y = 34;       // A number without decimals

特别大的或者特别小的数字可以用科学计数法:

var x = 123e5;    // 12300000
var y = 123e-5;   // 0.00123

JavaScript 数字总是64位浮点

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

JavaScript 数字总是存储为双精度浮点数, 按照国际IEEE 754标准.

这种格式将数字存储在64位,其中数字(分数)存储在位0到51,指数在位52到62,和符号在位63:

Value (aka Fraction/Mantissa) Exponent Sign
52 bits (0 - 51)  11 bits (52 - 62) 1 bit (63)

精确度

整数被认为是精确到15位数.

var x = 999999999999999;   // x will be 999999999999999
var y = 9999999999999999;  // y will be 10000000000000000

让我试试

小数的最大数量 17, 但浮点运算并不总是100%准确:

var x = 0.2 + 0.1;         // x will be 0.30000000000000004

让我试试

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

var x = (0.2 * 10 + 0.1 * 10) / 10;       // x will be 0.3

让我试试


十六进制

JavaScript 解读数字常量作为16进制,如果他们以0x开头.

var x = 0xFF;             // x will be 255

让我试试

不要用前导零写数字 (像 07). 一些JavaScript版本解释数字如果他们用前导零为八进制.

默认情况下,JavaScript显示数字为10进制数.

但是你能使用toString()方法 作为16进制、8进制和2进制输出数字.

var myNumber = 128;
myNumber.toString(16);     // returns 80
myNumber.toString(8);      // returns 200
myNumber.toString(2);      // returns 10000000

让我试试


Infinity

正无穷大 (或者 负无穷大) 如果你计算一个数超出了最大数的范围,将返回的数字.

var myNumber = 2;
while (myNumber != Infinity) {          // Execute until Infinity
    myNumber = myNumber * myNumber;
}

让我试试

除以0(零)也产生无穷大的数:

var x =  2 / 0;          // x will be Infinity
var y = -2 / 0;          // y will be -Infinity

让我试试

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

typeof Infinity;        // returns "number"

让我试试


NaN - 不是一个数字

NaN是一个javascript的保留字,表示一个数不是一个合法的数.

试图用非数值字符串做算术会导致 NaN (Not a Number):

var x = 100 / "Apple";  // x will be NaN (Not a Number)

让我试试

但是,如果字符串包含一个数值,结果将是一个数字:

var x = 100 / "10";     // x will be 10

让我试试

你可以使用全局JavaScript函数isNaN()来判断一个值是否是一个数字

var x = 100 / "Apple";
isNaN(x);               // returns true because x is Not a Number

让我试试

注意NaN. 如果一个操作数是NaN,结果也是NaN:

var x = NaN;
var y = 5;
var z = x + y;         // z will be NaN

让我试试

或结果可能会是一个字符串连接:

var x = NaN;
var y = "5";
var z = x + y;         // z will be NaN5

让我试试

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

typeof NaN;             // returns "number"

让我试试


数字可以是对象

通常的JavaScript数字是原始值,由字面量创建: var x = 123

但数字也可以使用关键字new创建为对象: var y = new Number(123)

var x = 123;
var y = new Number(123);

// typeof x 返回 number
// typeof y 返回 object

让我试试

不要创建数字对象。它减慢执行速度。new关键字使代码复杂化。这会产生一些意想不到的结果:

当使用 == 操作符时, 等数相等:

var x = 500;             
var y = new Number(500);

// (x == y) is true because x and y have equal values

让我试试

当使用===运算符时,相等数不相等,因为操作符在类型和值上都期望相等.

var x = 500;             
var y = new Number(500);

// (x === y) is false because x and y have different types

让我试试

甚至更糟。对象不能比较:

var x = new Number(500);             
var y = new Number(500);

// (x == y) is false because objects cannot be compared

让我试试

比较两个JavaScript对象将始终返回false。