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'
如果仔细观察上面的例子,你会发现最后一个操作的结果不仅仅是一个简单的字符串连接,因为具有相同优先级的运算符是从左到右计算的。这就是为什么,因为变量 x
和 y
都是数字,所以它们首先被添加,然后结果与变量 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 单位例如值此方法在以下情况下特别方便 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()
方法。此方法返回的值是一个字符串,它具有精确指定的小数点后面的数字的个数。如果未指定或省略参数,则将参数视为 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_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 数学运算 章节,了解有关舍入数字,生成随机数,从一组数字中查找最大值或最小值等的信息。