HOWTO · JavaScript
如何在 JavaScript 中將浮點數轉換為整數
了解如何截斷或四捨五入 JavaScript 的 Number、解析十進位文字,並避免不安全的位元運算簡寫。
本頁內容
JavaScript 沒有分開的 int 和 float 型別,兩者通常都以 Number 表示。若要移除現有數值的小數部分,請使用朝零截斷的 Math.trunc()。這種操作稱為朝零截斷:
console.log(Math.trunc(12.75));
console.log(Math.trunc(-12.75));
輸出:
12
-12
正確的方法取決於你需要的結果:
- 使用
Math.trunc(value)朝零捨棄小數部分。 - 需要指定捨入方向時使用
Math.floor(value)或Math.ceil(value)。 - 使用
Math.round(value)選擇最接近的整數。 - 輸入是十進位文字時使用
parseInt(text, 10),不要把它當成截斷Number的預設方法。
使用 Math.trunc() 截斷數字
Math.trunc() 不進行捨入,只回傳數字的整數部分。正數會移除小數點後的內容;負數會朝零移動,因此 -12.75 會變成 -12,而不是 -13。
const value = -12.75;
console.log(Math.trunc(12.75));
console.log(Math.trunc(value));
輸出:
12
-12
當值已經是數字且只需保留整數部分時,這通常是最清楚的選擇。介於 -1 和 0 之間的值可能產生負零:
console.log(Object.is(Math.trunc(-0.5), -0));
輸出:
true
如果應用程式必須區分 -0 和 0,請明確處理這種情況。
使用 floor()、ceil() 或 round() 進行捨入
截斷和捨入是不同的操作。Math.floor() 回傳小於或等於該值的最大整數,Math.ceil() 回傳大於或等於該值的最小整數。對負數而言,這項差異尤其重要:
const value = -12.75;
console.log(Math.floor(value));
console.log(Math.ceil(value));
console.log(Math.round(-1.5));
輸出:
-13
-12
-1
下限使用 Math.floor(),上限使用 Math.ceil(),需要最接近的整數時使用 Math.round()。JavaScript 的 Math.round() 在等距時朝正無限大處理,因此 Math.round(-1.5) 會回傳 -1。
使用 parseInt() 解析十進位文字
當來源是字串時,parseInt() 可以解析其中的整數前綴。對十進位文字,請將基數設為 10:
console.log(parseInt("12.75", 10));
console.log(Number.isNaN(parseInt("not a number", 10)));
輸出:
12
true
parseInt() 遵循解析規則,遇到對該基數無效的字元時可能停止。因此它不同於截斷現有數字。例如,輸入必須先完整轉換並驗證為數字時,適合使用 Math.trunc(Number("12.75"))。可能有無效輸入時,請使用 Number.isNaN() 或其他驗證規則。
一般轉換時避免使用 toFixed() 和位元運算簡寫
Number.toFixed() 是格式化方法。它會捨入到指定的小數位數並回傳字串,因此不是一般的整數轉換方法:
console.log(typeof (12.75).toFixed(0));
輸出:
string
value | 0、~~value 和 value >> 0 等位元運算也會朝零截斷,但會先將值轉換為有正負號的 32 位元整數。超出此範圍的值可能發生回繞:
console.log(2 ** 31 | 0);
輸出:
-2147483648
只有在確實需要有正負號的 Int32 強制轉換時,才使用這些運算式。它們不是更安全或更清楚的 Math.trunc() 替代方案。
需要注意的限制
Number 使用 IEEE 754 雙精度浮點表示法。整數只有在 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 範圍內才能精確表示;精確整數運算很重要時請使用 Number.isSafeInteger(),並明確處理非有限值:
console.log(Math.trunc(Infinity));
console.log(Math.trunc(NaN));
輸出:
Infinity
NaN
Math.trunc() 不會把 Infinity、-Infinity 或 NaN 變成有限整數。若應用程式需要有限且安全的整數,請驗證輸入。
摘要
對於現有的 JavaScript 數字,如果「整數」表示朝零移除小數部分後的值,請先使用 Math.trunc(value)。需要特定捨入規則時選擇 Math.floor()、Math.ceil() 或 Math.round()。十進位文字使用 parseInt(text, 10);記住 toFixed() 會產生格式化文字,除非刻意進行有正負號的 32 位元轉換,否則應避免位元運算簡寫。