JAVASCRIPT 基础教程
JAVASCRIPT & DOM
JAVASCRIPT & BOM
JAVASCRIPT 高级教程
JAVASCRIPT 示例
JAVASCRIPT 参考

JavaScript 数字

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

使用数字

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

var x = 2;  // 整数
var y = 3.14;  // 浮点数
var z = 0xff;  // 十六进制数

超大数可以用指数符号表示,例如 6.02e+23(与 6.02x1023 相同)。

var x = 1.57e4;  // 与 15700 相同 
var y = 4.25e+6;  // 与 4.25e6 或 4250000 相同
var z = 4.25e-6;  // 与 0.00000425 相同

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

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

var x = 0xff;  // 与 255 相同
var y = 0xb4;  // 与 180 相同 
var z = 0x00;  // 与 0 相同

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


对数字和字符串进行操作

从前面的章节中您知道,+ 运算符用于加法和连接。 因此,对数字和字符串执行数学运算可能会产生有趣的结果。 以下示例将向您展示添加数字和字符串时会发生什么:

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

// 将数字与数字相加,结果将是数字的总和
console.log(x + y); // 30

// 用字符串添加字符串,结果将是字符串连接
console.log(z + z); // '3030'

// 将数字与字符串相加,结果将是字符串连接
console.log(x + z); // '1030'

// 添加带有数字的字符串,结果将是字符串连接
console.log(z + x); // '3010'

// 添加字符串和数字,结果将是字符串连接
console.log("The result is: " + x + y); // 'The result is: 1020'

// 添加数字和字符串,从左到右执行计算
console.log(x + y + z); // 'The result is: 3030'

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

但是,如果您执行其他数学运算,例如乘法、除法或减法,结果会有所不同。 JavaScript 会在所有数值运算中自动将 numeric strings(即包含数值的字符串)转换为 numbers,如下例所示:

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

// 从一个数字中减去一个数字
console.log(y - x); // 10

// 从数字字符串中减去一个数字
console.log(z - x); // 20

// 将数字与数字字符串相乘
console.log(x * z); // 300

// 用数字字符串除数字
console.log(z / x); // 3

此外,如果您尝试将数字与非数字字符串相乘或除,它会返回 NaN(非数字)。 此外,如果您在数学运算中使用 NaN,结果也将是 NaN

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

// 从非数字字符串中减去一个数字
console.log(y - x); // NaN

// 将数字与非数字字符串相乘
console.log(x * y); // NaN

// 将数字与非数字字符串相除
console.log(x / y); // NaN

// 将 NaN 添加到数字
console.log(x + z); // NaN
						
// 将 NaN 添加到字符串
console.log(y + z); // fooNaN

Infinity 代表无穷

无穷大表示一个 JavaScript 无法处理的数字。 JavaScript 有特殊的关键字 Infinity-Infinity 分别表示正无穷和负无穷。 例如,除以 0 返回 Infinity,如下所示:

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

var y = -5 / 0;
console.log(y); // 负无穷

注意: Infinity 是一个特殊值,表示数学上的 Infinity ,它大于任何数字。 typeof 运算符返回 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+8 或 6.25e+10。


将数字格式化为固定小数

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

var x = 72.635;

console.log(x.toFixed());  // '73' (note rounding, no fractional part)
console.log(x.toFixed(2));  // '72.64' (note rounding)
console.log(x.toFixed(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() 方法。 该方法返回一个字符串,表示指定精度的数字。

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

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 对象还有几个与之关联的属性。 Number 对象的 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 数学运算 章节,了解舍入数字、生成随机数、从一组数字中查找最大值或最小值等 .

Advertisements