數字

數字 在 JavaScript

20 個練習

關於 數字

JavaScript 裡有兩種不同的數字:數字與「bigint」。

數字最常被使用,代表雙精確度 64 位元浮點格式的數值資料型態。

  • number:雙精確度 64 位元浮點格式(IEEE 754)的數值資料型態。 例如 -6、-2.4、0、0.1、1、3.14、16.984025、25、976、1024.0 和 500000。
  • bigint:能以任意精度格式表示_整數_的數值資料型態。 例如 -12n、0n、4n 和 9007199254740991n。
let numericValue = 42;
// => 42

JavaScript 程式碼中像 42 這樣的數字字面值是浮點數值,不是整數。 日常使用中並沒有獨立的整數型別。 bigint 型別的設計並不是要在日常用途中取代 number 型別。 42 仍然是 Number,不是 BigInt。

數字也可以用像 0b101、0o13、0x0A 這樣的字面值形式來表示。想進一步了解數值詞法文法,請看這裡。

特殊表示法

指數標記法

E 標記法表示的數字,是要乘以 10 的某個次方。 E 標記法的格式是一個數字,後面接著 e 或 E,再接著要乘的 10 的次方。

const num = 3.125e7;
// => 31250000
// The notation essentially says, "Take 3.125 and multiply it by 10^7".

E 標記法也可以用來表示非常小的數字:

const num = 325987e-6; // Equals 0.325987
// The notation essentially says, "Take 325987 and multiply it by 10^-6.

底線標記法

底線可以讓使用者更容易閱讀大數字。編譯器會完全忽略這些底線。

const num = 1_000_000; // You can read this as 1,000,000
console.log(num);
// => 1000000

內建物件

在處理數字時,有兩個內建物件很有用:

Math 也包含將數字取整的方法。 你可以在這篇 javascript.info 關於取整的文章 中進一步了解可用的取整選項。

Math.floor(234.34); // => 234
Math.ceil(234.34); // => 235

內建的 Number 全域 object _也_是一個全域 function,可以用來將_幾乎任何_類似數字的東西轉換成 number。 它比把 string _解析_成 number 更嚴格。

const date = new Date('December 17, 1995 03:24:00');
const unix = Number(date);

unix;
// => 819199440000

JavaScript 中數字有三種最大值(以及最小值/最大負值):

  • VALUE:由 Number.MAX_VALUE 和 Number.MIN_VALUE 給出
  • INFINITY:由 Number.POSITIVE_INFINITY 和 Number.NEGATIVE_INFINITY 給出
  • SAFE_INTEGER:由 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 給出

由於 JavaScript 中數字的實作方式,Number.MIN_VALUE 和 Number.MAX_VALUE 之間的數字並非每一個都能表示。 不過,Number.MIN_SAFE_INTEGER - 1 和 Number.MAX_SAFE_INTEGER + 1 之間的_每一個_數字都能表示。

特殊的數字值

JavaScript 有幾個特殊的數字值:

  • 兩個錯誤值:NaN 和 Infinity。
  • 兩個零的值:+0 和 -0。

NaN - 不是數字

錯誤值 NaN(又稱「不是數字」)會在下列情況產生。

  • 無法解析數字:
    Number('123'); // => 123
    Number('Hello, World!'); // => NaN
    
  • 運算失敗:
    Math.sqrt(-64); // => NaN
    
  • 其中一個運算元是 NaN:
    NaN + 69; // => NaN
    

NaN 是唯一不等於自身的值:

NaN === NaN; // => false

如果你想檢查某個值是不是 NaN,必須使用全域函式 isNaN():

isNaN(NaN); // => true
isNaN(123); // => false

Infinity

Infinity 是錯誤值,代表下列兩種問題之一:

  • 數字的量值太大,無法表示。
    Math.pow(2, 1024); // => Infinity
    
  • 發生了除以零。
    6 / 0; // => Infinity
    -6 / 0; // => -Infinity
    

Infinity 比任何其他數字都大(除了 NaN)。 同樣地,-Infinity 比任何其他數字都小(除了 NaN)

全域函式 isFinite() 可以讓你檢查某個值是不是真正的數字(既不是無限大,也不是 NaN):

isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false

兩個零

+0 和 -0 在 JavaScript 中是不同的數字。當你表示的數字小到與 0 無法區分時,就可能產生它們。 帶正負號的零讓你記錄你是「從哪個方向」接近零的;也就是說,這個數字在被視為零之前帶有什麼正負號。 最好的做法是假裝只有一個零。

比較

數字的值相同時,就視為相等。

1 == 1.0;
// => true

1 === 1.0;
// => true
// Remember, all numbers are floating-points, so this is
// different syntax for the exact same value.

1 === 1n;
// => false
// Strictly checking a number against a bigint will always result
// in false.

關於一般的比較,以及 JavaScript 中數值比較的更多資訊,請參閱比較。

陷阱

因為 JavaScript 中的數字是浮點數,所有使用這些值的數學運算都是浮點運算。 因此,在 JavaScript 中:

0.1 + 0.2 === 0.3;
// => false

簡短說明請見 0.30000000000000004.com,深入說明請見 Oracle《Numerical Computation Guide》的附錄 D〈What Every Computer Scientist Should Know About Floating-Point Arithmetic〉。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 數字

練習已鎖定

再解鎖 1 個練習,就能練習 數字