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(又稱「不是數字」)會在下列情況產生。
Number('123'); // => 123
Number('Hello, World!'); // => NaN
Math.sqrt(-64); // => NaN
NaN + 69; // => NaN
NaN 是唯一不等於自身的值:
NaN === NaN; // => false
如果你想檢查某個值是不是 NaN,必須使用全域函式 isNaN():
isNaN(NaN); // => true
isNaN(123); // => false
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〉。