JavaScript 数字

在本教程中,你将学习如何在 JavaScript 中表示数字。

使用数字

JavaScript 支持整数和浮点数,可以用十进制,十六进制或八进制表示法表示。与其他语言不同,JavaScript 不会以不同方式处理整数和浮点数。JavaScript 中的所有数字都表示为浮点数。这是一个展示不同格式的数字的示例:

var x = 2;  // integer number
var y = 3.14;  // floating-point number
var z = 0xff;  // hexadecimal number

超大数字可以用指数表示法表示,例如 6.02e+23(与 6.02x10 23 相同)。

var x = 1.57e4;  // same as 15700
var y = 4.25e+6;  // same as 4.25e6 or 4250000
var z = 4.25e-6;  // same as 0.00000425

提示: JavaScript 中最大的安全整数是 9007199254740991(253-1),而最小的安全整数是 -9007199254740991 (-(253-1))。

数字也可以用十六进制表示法表示(基数 16)。十六进制数字以前缀为前缀 0x 。它们通常用于表示颜色。这是一个例子:

var x = 0xff;  // same as 255
var y = 0xb4;  // same as 180
var z = 0x00;  // same as 0

注意: 整数可以用十进制,十六进制和八进制表示法表示。浮点数可以用十进制或指数表示法表示。

操作数字和字符串

如前所述, + 运算符用于加法和连接。因此,对数字和字符串执行数学运算可能会产生有趣的结果。以下示例将向你显示添加数字和字符串时会发生什么:

var x = 10;
var y = 20;
var z = "30";

// Adding a number with a number, the result will be sum of numbers
console.log(x + y); // 30

// Adding a string with a string, the result will be string concatenation
console.log(z + z); // '3030'

// Adding a number with a string, the result will be string concatenation
console.log(x + z); // '1030'

// Adding a string with a number, the result will be string concatenation
console.log(z + x); // '3010'

// Adding strings and numbers, the result will be string concatenation
console.log("The result is: " + x + y); // 'The result is: 1020'

// Adding numbers and strings, calculation performed from left to right
console.log(x + y + z); // 'The result is: 3030'

如果仔细观察上面的例子,你会发现最后一个操作的结果不仅仅是一个简单的字符串连接,因为具有相同优先级的运算符是从左到右计算的。这就是为什么,因为变量 xy 都是数字,所以它们首先被添加,然后结果与变量 z 连接,这是一个字符串,因此最终结果是 30 + "30" = "3030"

但是,如果执行其他数学运算,如乘法、除法或减法,结果将会有所不同。的 JavaScript 将自动转换数字字符串 (即字符串包含数字值),以数字在所有的数字操作,显示在下面的例子:

var x = 10;
var y = 20;
var z = "30";

// Subtracting a number from a number
console.log(y - x); // 10

// Subtracting a number from a numeric string
console.log(z - x); // 20

// Multiplying a number with a numeric string
console.log(x * z); // 300

// Dividing a number with a numeric string
console.log(z / x); // 3

此外,如果你尝试使用非数字字符串对数字进行乘法或除法,则返回 NaN (非数字)。此外,如果你 NaN 在数学运算中使用,结果也将是 NaN

var x = 10;
var y = "foo";
var z = NaN;

// Subtracting a number from a non-numeric string
console.log(y - x); // NaN

// Multiplying a number with a non-numeric string
console.log(x * y); // NaN

// Dividing a number with a non-numeric string
console.log(x / y); // NaN

// Adding NaN to a number 
console.log(x + z); // NaN
                        
// Adding NaN to a string 
console.log(y + z); // fooNaN

无穷大

无穷大代表了一个太大而无法处理 JavaScript 的数字。JavaScript 具有特殊关键字 Infinity-Infinity 分别代表正负无穷大。例如,除以 0 的结果是 Infinity ,如下所示:

var x = 5 / 0;
console.log(x); // Infinity

var y = -5 / 0;
console.log(y); // -Infinity

避免精确问题

有时,对浮点数的操作会产生意外结果,如下所示:

var x = 0.1 + 0.2;
console.log(x) // 0.30000000000000004

正如你所看到的,结果 0.30000000000000004 不是预期的结果 0.3 。这种差异称为表示错误舍入误差。之所以出现这种情况是因为 JavaScript 和许多其他语言使用二进制(基数 2)形式在内部表示十进制(基数为 10)的数字。不幸的是,大多数小数部分不能以二进制形式精确表示,因此会出现很小的差异。

要避免此问题,你可以使用以下解决方案:

var x = (0.1 * 10 + 0.2 * 10) / 10;
console.log(x) // 0.3

JavaScript 将浮点数舍入为 17 位数,这在大多数情况下足够精确或准确。此外,在 JavaScript 中,整数(没有小数部分或指数表示法的数字)的准确度最高可达 15 位,如下例所示:

var x = 999999999999999;
console.log(x); // 999999999999999

var y = 9999999999999999;
console.log(y); // 10000000000000000

对数字执行操作

JavaScript 提供了几个属性和方法来对数值执行操作。正如你在前面的章节中已经知道的那样,在 JavaScript 中,当你使用属性访问表示法(即点表示法)引用它们时,原始数据类型可以像对象一样。

在以下部分中,我们将介绍最常用的数字方法。

解析字符串中的整数

parseInt() 方法可用于解析字符串中的整数。当你在处理像 CSS 单位例如值此方法在以下情况下特别方便 50px12pt 等你想提取的数值出来。

如果 parseInt() 方法遇到指定基数中不是数字的字符,它将停止解析并返回解析到该点的整数值。如果第一个字符无法转换为数字,则该方法将返回 NaN (不是数字)。

允许前面和后面填充空格。这是一个例子:

console.log(parseInt("3.14"));  // 3
console.log(parseInt("50px"));  // 50
console.log(parseInt("12pt"));  // 12
console.log(parseInt("0xFF", 16));  // 255
console.log(parseInt("20 years"));  // 20
console.log(parseInt("Year 2048"));  // NaN
console.log(parseInt("10 12 2018"));  // 10

注意: parseInt() 方法将数字截断为整数值,但不应将其用作 Math.floor() 方法的替代。

同样,你可以使用该 parseFloat() 方法从字符串中解析浮点数。parseFloat() 方法的工作方式与 parseInt() 方法相同,只是它检索整数和带小数的数字。

console.log(parseFloat("3.14"));  // 3.14
console.log(parseFloat("50px"));  // 50
console.log(parseFloat("1.6em"));  // 1.6
console.log(parseFloat("124.5 lbs"));  // 124.5
console.log(parseFloat("weight 124.5 lbs"));  // NaN
console.log(parseFloat("6.5 acres"));  // 6.5

将数字转换为字符串

toString() 方法可用于将数字转换为其等效字符串。此方法可选地接受范围为 2 到 36 的整数参数,指定用于表示数值的基数。这是一个例子:

var x = 10;
var y = x.toString();
console.log(y);  // '10'
console.log(typeof y);  // string
console.log(typeof x);  // number

console.log((12).toString());  // '12'
console.log((15.6).toString());  // '15.6'
console.log((6).toString(2));  // '110'
console.log((255).toString(16));  // 'ff'

以指数表示法格式化数字

你可以使用该 toExponential() 方法以指数表示法格式化或表示数字。此方法可选地接受一个整数参数,指定小数点后的位数。此外,返回的值是字符串而不是数字。这是一个例子:

var x = 67.1234;

console.log(x.toExponential());  // 6.71234e+1
console.log(x.toExponential(6));  // 6.712340e+1
console.log(x.toExponential(4));  // 6.7123e+1
console.log(x.toExponential(2));  // 6.71e+1

注意: 指数表示法对于表示幅度非常大或非常小的数字非常有用。例如,62500000000 可写为 625e+86.25e+10

将数字格式化为固定小数

如果要格式化小数点右侧固定位数的数字,可以使用 toFixed() 方法。此方法返回的值是一个字符串,它具有精确指定的小数点后面的数字的个数。如果未指定或省略参数,则将参数视为 0.以下是一个示例:

var x = 72.635;

console.log(x.toFixed());  // '73' (note rounding, no fractional part)
console.log(x.toPrecision(2));  // '72.64' (note rounding)
console.log(x.toPrecision(1));  // '72.6'

var y = 6.25e+5;
console.log(y.toFixed(2)); // '625000.00'

var z = 1.58e-4;
console.log(z.toFixed(2));  // '0.00' (since 1.58e-4 is equal to 0.000158)

精确格式化数字

如果你想要最合适的数字形式,则可以使用 toPrecision() 方法。此方法返回表示指定精度的数字的字符串。

如果精度足够大以包括数字的整数部分的所有数字,则使用定点表示法格式化数字。否则,使用指数表示法格式化数字。precision 参数是可选的。这是一个例子:

var x = 6.235;

console.log(x.toPrecision());  // '6.235'
console.log(x.toPrecision(3));  // '6.24' (note rounding)
console.log(x.toPrecision(2));  // '6.2'
console.log(x.toPrecision(1));  // '6'

var y = 47.63;
console.log(y.toPrecision(2)); // '48' (note rounding, no fractional part)

var z = 1234.5;
console.log(z.toPrecision(2));  // '1.2e+3'

寻找最大和最小的可能数字

数字对象还有几个与之关联的属性。数字对象的 Number.MAX_VALUENumber.MIN_VALUE 属性表示 JavaScript 可以处理的最大和最小(最接近零,而不是最负)可能的正数。他们是常数,它们的实际值分别是 1.7976931348623157e+3085e-324

超出可能数字范围的数字由常数 Number.POSITIVE_INFINITYNumber.NEGATIVE_INFINITY 。这是一个例子:

var a = Number.MAX_VALUE;
console.log(a); // 1.7976931348623157e+308

var b = Number.MIN_VALUE;
console.log(b); // 5e-324

var x = Number.MAX_VALUE * 2;
console.log(x); // Infinity

var y = -1 * Number.MAX_VALUE * 2;
console.log(y); // -Infinity

另外,请查看 JavaScript 数学运算 章节,了解有关舍入数字,生成随机数,从一组数字中查找最大值或最小值等的信息。