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 數學運算 章節,瞭解有關舍入數字,生成隨機數,從一組數字中查詢最大值或最小值等的資訊。