一個數字 x 的絕對值,以直立線記號寫成 |x|,代表它在數線上與零點之間的距離,而該距離絕不會是負的,所以 |x| 永遠是零或正數。在 Java 中,這可以透過 java.lang.Math 裡的靜態方法來計算:Math.abs(int)、Math.abs(long)、Math.abs(float) 和 Math.abs(double),每一個都接受一個帶正負號的數字,並回傳去掉負號後的相同數值型別。呼叫 Math.abs(-7) 會回傳 7,Math.abs(7) 會回傳 7,Math.abs(0) 則回傳 0。Java 也內建了 Math.absExact(int) 和 Math.absExact(long),其行為類似 Math.abs,但當結果會溢位到整數範圍時會拋出 ArithmeticException,讓你在 Integer.MIN_VALUE 或 Long.MIN_VALUE 附近的緊密運算中獲得更安全的行為。由於絕對值會去除方向、只保留大小,所以無論是在程式碼中計算或使用 絕對值計算機,只要你需要的是大小、距離或誤差量,而不是帶正負號的值,它就是最直覺的工具。

數學中的絕對值是什麼?
絕對值回答的是「距離零多遠」,而不是「方向是哪邊」。形式上來說,當 x 大於或等於 0 時 |x| = x,當 x 小於 0 時 |x| = -x。所以如果 x 為正或為零,絕對值就是該數本身;如果 x 為負,則會去掉負號使其翻為正。一個好用的捷徑是 |x| = √(x²):平方會去除正負號,而主平方根則回傳非負的根,得到的結果相同。
有三個性質值得記住。第一,|x| ≥ 0 對所有實數 x 都成立,因為絕對值絕不會是負的。第二,|x| = |-x|:一個數字和它的相反數擁有相同的絕對值,因為 |-5| 和 |5| 都等於 5。第三,只有當 x 本身為 0 時 |x| = 0,這使得 0 成為唯一一個與自身距離為零的數字。
只要「大小」比「方向」重要時,就會出現絕對值。在數線上兩點 a 和 b 之間的距離為 |a - b|,而且相減的順序不會改變結果,因為 |a - b| = |b - a|。在統計學中,平均絕對誤差會回報平均誤差量,而不會告訴你預測值是高估還是低估。在物理學中,速度是速度向量的大小,振幅則是訊號的絕對峰值。這些應用都遵循同一條規則:去掉正負號,只保留大小。
如何在 Java 中計算絕對值
Java 在 java.lang.Math 中提供了四個標準的絕對值方法,另外還有兩個溢位檢查的變體。由於 java.lang.Math 會自動匯入,因此不需要撰寫 import 陳述式,你可以從任何類別直接呼叫這些方法。
| 方法 | 輸入型別 | 回傳 | 邊界情況下的行為 |
|---|---|---|---|
| Math.abs(int a) | int | int | 因為對應的正值無法以 int 表示,所以 Math.abs(Integer.MIN_VALUE) 會回傳 Integer.MIN_VALUE。 |
| Math.abs(long a) | long | long | Long.MIN_VALUE 也適用同樣的邊界情況。 |
| Math.abs(float a) | float | float | 輸入為 NaN 時回傳 NaN,輸入為 ±infinity 時回傳 +infinity,輸入為 ±0.0 時回傳 0.0。 |
| Math.abs(double a) | double | double | 與 float 版本相同的 NaN、infinity 以及 ±0.0 規則。 |
| Math.absExact(int a) | int | int | 當結果會溢位時會拋出 ArithmeticException,而不是回傳一個錯誤的正負號。 |
| Math.absExact(long a) | long | long | long 版本同樣具有溢位檢查行為。 |
標準的形式幾乎足以應付所有程式。本文單一可運作的範例:int n = Math.abs(-42); 會將 n 設為 42,因為 |-42| = 42。double 版本 double d = Math.abs(-3.14); 會將 d 設為 3.14,這和當你在絕對值計算機的輸入欄中輸入 -3.14 時所得到的值相同。
如果你的程式碼可能會遇到 Integer.MIN_VALUE 或 Long.MIN_VALUE(這在兩個大數字相減,或是對 int 取負號時很常見),請優先使用 Math.absExact,讓它明確失敗,而不是悄悄得到一個負的「絕對值」。像下面這樣的防護機制能在溢位影響下游運算之前將其攔截:try { int safe = Math.absExact(x); } catch (ArithmeticException e) { throw new IllegalStateException("overflow computing |x|"); }
對 float 和 double 來說,絕對值與 IEEE 754 特殊值的互動是可以預期的:Math.abs(Double.NaN) 會回傳 NaN,Math.abs(Double.POSITIVE_INFINITY) 會回傳 POSITIVE_INFINITY,Math.abs(-0.0) 會回傳 0.0,Math.abs(-1.0e308) 則回傳 1.0e308。在你除錯數值程式碼時,了解這些規則很重要,因為一個經過 Math.abs 之後仍然存活的 NaN 仍然是 NaN,而 infinity 也依然是 infinity。
如何使用線上絕對值計算機
如果你想在不打開 IDE 的情況下得到相同的答案,絕對值計算機可以在瀏覽器的分頁中幫你完成這項工作。它完全在你的裝置上執行,所以不會上傳任何資料,而結果會在你輸入時即時更新。
- 在輸入欄中輸入任何數字——負數、小數,以及像 1.2e4 或 6.02e23 這樣的科學記號都可以接受。
- 在結果面板中即時讀取絕對值 |x|;這個數值會在你編輯時即時更新,不需要按任何按鈕。
- 點擊複製 (Copy) 把結果放到剪貼簿,這樣你就能貼到作業、試算表或原始碼中。
舉例來說,輸入 -8 會回傳 8,輸入 8 會回傳 8,輸入 0 會回傳 0,而輸入 -1.2e-4 則會回傳 1.2e-4。支援的輸入範圍最大大約為 1.8 × 10³⁰⁸;超出該範圍的值已超過電腦能儲存的範圍,會被標記出來,而不是默默四捨五入。
Java 方法 vs. 線上計算機
兩種方式都會回傳相同的數字——絕對值的規則在程式碼和瀏覽器之間並沒有不同——但它們適合不同的工作情境。請參考下表來決定哪一種更符合你眼前的任務。
| 面向 | Java Math.abs 系列 | 線上絕對值計算機 |
|---|---|---|
| 需要的前置準備 | JDK、IDE 或編譯器,以及一個專案或暫存檔案 | 只需要一個瀏覽器分頁——不需安裝任何東西 |
| 接受的輸入 | 僅接受 int、long、float 和 double 基本型別 | 任何實數,包括小數和像 1.2e4 這樣的科學記號 |
| 輸出格式 | 與輸入相同的數值型別,可直接用於後續運算 | |x| 顯示在結果面板中,並提供複製按鈕以便使用剪貼簿 |
| 運算執行位置 | 在執行你程式碼的 JVM 上 | 在你的瀏覽器本機執行;不會上傳任何資料 |
| 最佳使用時機 | 在需要大規模使用 |x| 的執行中程式內部 | 用於作業、試算表、誤差範圍或單次距離問題的快速檢查 |
當目標是交付一個功能時,Math.abs 是正確的工具——它就存在於你的程式碼庫中,並能在任何資料集上以全速執行。當目標是檢查單一數值、驗算一道計算,或確認某個公式應該產生什麼結果時,計算機則更為迅速:沒有編輯器、不需編譯、不需測試,只要輸入並讀取結果即可。
絕對值在實際程式碼中的出現時機
絕對值是那種單獨看起來微不足道、卻隨處都會出現的運算。在 Java 程式中,你最有可能在以下這些情境中呼叫 Math.abs。
測量誤差。當你把測量值與真實值進行比較時,絕對誤差就是 Math.abs(measured - true)。帶正負號的版本會告訴你是高估還是低估,但絕對值能告訴你誤差有多大。在回報準確度、計算容差,或繪製殘差圖時,你想要的正是後者。
兩數之間的距離。在數線上,兩個數字 a 和 b 之間的距離是 Math.abs(a - b)。順序並不重要,因為 Math.abs(a - b) == Math.abs(b - a)。同樣的概念可推廣到二維和三維的曼哈頓 (L1) 距離,它是將各分量絕對差值相加,許多分群和分類演算法都以此為基礎。
變化量的大小。當你隨著時間記錄股票價格、溫度讀數或感測器數值時,通常重要的會是變化量的大小,而不是它是上升還是下降。一系列的 Math.abs(current - previous) 數值能在不考慮方向的情況下告訴你訊號有多劇烈波動。
健全性檢查。一個常見的除錯模式,是透過斷言 value == Math.abs(value) 來確認一個本應為非負的量確實為非負。如果斷言失敗,就代表有一個負號漏出到不應該出現的位置。
不等式約束。像 Math.abs(x - 5) < 2 這樣的條件,描述的是所有與 5 相距不到 2 的數字,這正是許多搜尋和最佳化迴圈背後的規則。
對於上述所有情境,所使用的數學都與瀏覽器工具相同。如果你想在把單一數值寫入測試之前先驗證答案,可以把數字輸入絕對值計算機,確認 |x| 和你的程式碼所回傳的結果一致。
在 Java 中計算絕對值的常見陷阱
即使是經驗豐富的開發人員,也會落入兩個陷阱,這兩者都值得特別留意。
Integer.MIN_VALUE 邊界情況。Math.abs(Integer.MIN_VALUE) 會回傳 Integer.MIN_VALUE 而不是正數,因為對應的正值 (+2147483648) 比 int 的最大值還大 1。Long.MIN_VALUE 也會發生同樣的情況。如果你的程式碼可能會遇到這些值(在你對相減的結果取負號時很常見),請使用 Math.absExact,它會拋出 ArithmeticException,迫使你必須處理溢位,而不是讓一個隱而不顯的 bug 跟著上線。
NaN 會存活於 Math.abs 之後。Math.abs(Double.NaN) 會回傳 NaN。這在技術上是正確的,但這代表 NaN 可能躲在一個「絕對值」裡,之後又再次出現,毒化後續的比較。如果你不希望 NaN 繼續傳播,請在呼叫 Math.abs 之前先用 Double.isFinite 守護輸入,或對 int 和 long 版本使用 Math.absExact。
這兩個陷阱在程式碼審查時很容易被忽略,因為絕對值看起來非常簡單。線上工具則能在進行單次檢查時避開這些問題,因為它會直接針對你輸入的數字運算,並回傳一個非負值。
延伸閱讀:如何一步步計算絕對值。
延伸閱讀:如何計算複數的絕對值。