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 单位之类的值时特别方便,例如 50px
、12pt
等,您想从中提取数值。
如果 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_VALUE
和 Number.MIN_VALUE
属性表示 JavaScript 可以处理的最大和最小(最接近零,不是最负的)可能的正数。 它们是常量,它们的实际值分别是 1.7976931348623157e+308
和 5e-324
。
超出可能数字范围的数字由常量 Number.POSITIVE_INFINITY
或 Number.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 数学运算 章节,了解舍入数字、生成随机数、从一组数字中查找最大值或最小值等 .