要精確計算出圓角,先輸入原始的十進位數值,選擇一個介於 0 到 20 之間的小數位數,再從五種具名的捨入模式——四捨五入、銀行家捨入、無條件捨去、無條件進位,或直接截斷——中選擇一種,就能得到一個精確、可重現,並且保留所要求尾隨零的結果。「圓角」這個詞,通常會讓人聯想到 CSS 的 border-radius,或是 Photoshop 的遮罩,但它背後的算術,其實跟套用在任何精確量測值上的算術一模一樣:像是 12.5px 這樣的半徑、像是 0.7853981634 這樣的曲線常數,或是規格表上像 0.075 這樣的一筆數字,都必須在不引入意外數值的前提下,縮短成指定的小數位數。專門的Rounding Calculator 會把數字當成文字來處理,並用整數運算來執行最後的進位動作,藉此完成這項工作,因此得到的結果,會符合你選擇的捨入規則,而不是二進位浮點數表示法所產生的假象。這篇文章,會逐一說明各種模式、操作步驟、輸入限制,以及最常見的錯誤,好讓你算出來的捨入結果,符合你的專案實際需要的規則。

how to calculate rounded corners
how to calculate rounded corners

「圓角」對數值來說代表什麼

圓角的幾何形狀,一開始永遠是一個精確的數字。設計師寫下 border-radius: 12.5px,工程師在 CNC 程式裡輸入 0.075 的圓角半徑,製造公差表上寫著 1.250 mm。這些數值,攜帶的精確度,通常都比文件、試算表,或畫面實際需要的還要高,因此下一步,就是把數值縮短成固定的小數位數。這個縮短的步驟,才是大多數人想要「計算圓角」時,實際在找的那項算術。

這個縮短動作聽起來很簡單,但你選擇的捨入政策,會改變答案。四捨五入、銀行家捨入、無條件捨去、無條件進位,以及直接截斷,在遇到剛好卡在中間的數值時,彼此並不一致,在處理負數時,也不一致。選錯模式,會讓算出來的圓角,在保留的最後一位數字上,出現數學上的一位之差,這種差異,在紙上往往看不出來,但在成品,或是渲染出來的介面上,卻很明顯。因此,你選擇的這個具名模式,本身就是答案的一部分,而不是事後才需要考慮的細節。

對日常量測值的捨入來說,一個線上的 Rounding Calculator,能把這項運算標準化,讓你在信任輸出結果之前,模式與小數位數的選擇,都是明確且看得見的。這個計算工具,遵循公開發布的ICU rounding modes,因此行為,會與實作同一份規格的函式庫保持一致。

可用的五種捨入模式

這個計算工具,提供五種具名模式,每一種都依照 Unicode 與 ICU 規格定義。下表整理了每一種模式的方向與決定平手時的規則,範例直接取自文件記載的行為。

模式 遇到剛好一半時的行為 處理負數時的方向 典型用途
四捨五入 剛好一半時,往遠離零的方向移動 與正數對稱;-1.235 在兩位小數時捨入為 -1.24 學校教的通用捨入方式
銀行家捨入 剛好一半時,讓保留下來的最後一位數字維持偶數 與正數對稱;在零位小數時,2.5 → 2,3.5 → 4 銀行家捨入法,能降低累積偏差
無條件捨去 不是以「剛好一半」為判斷基礎 朝負無限大方向;在零位小數時,-1.21 → -2 階梯函數、以完整年數計算年齡
無條件進位 不是以「剛好一半」為判斷基礎 朝正無限大方向;在零位小數時,-1.21 → -1 最低配額、向上補足
直接截斷 不是以「剛好一半」為判斷基礎 朝零的方向;在零位小數時,-1.99 → -1 移除精確度但不改變正負號

其中三種模式——無條件捨去、無條件進位,與直接截斷——都是方向性的運算。它們從不去尋找最接近的結果,因此即使一個數值被捨去的尾端很大,仍然會朝著指定的方向捨入。另外兩種「剛好一半」相關的模式,則會意識到平手的情況:它們會挑選最接近原始數值的結果,只有在被捨去的部分恰好等於一半時,才會退回使用一套文件規定的規則。計算工具中,每個選項旁邊顯示的標籤,都會說明方向,讓你在計算之前,就能看清楚兩者的差異。

如何一步一步計算圓角

每當你需要對一個量測值、半徑,或曲線常數進行捨入時,都遵循同樣的三個步驟。這套流程,直接取自這個計算工具已驗證過的操作步驟。

  1. 輸入一個純十進位數字,不含逗號或科學記號。輸入欄位接受選填的開頭正負號、數字,以及一個小數點;開頭的零可以省略,因此 .5 是合法的輸入。逗號分隔符號,以及像 1e3 這種指數形式,會被刻意拒絕,而不是被悄悄重新解讀,因此請寫成 1000.5,而不是 1,000.5,並把 1e3 展開成 1000。
  2. 選擇一個介於 0 到 20 之間的小數位數,並從五個具名選項中,選出所需要的捨入模式。每個選項旁邊顯示的模式標籤,會說明方向,讓你能在計算之前先確認政策,而小數位數欄位,則會把你要求的精確度,限制在系統支援的範圍之內。
  3. 選擇Round number,然後複製或比對這個精確且已格式化的結果。這個輸出結果,會保留你要求的小數位數,包括尾隨的零,因此 1000.00 所傳達的精確度,就與 1000 不同。如果想快速對照另一個應用程式的結果,可以試試看剛好卡在平手兩側附近的數值;如果那個應用程式給出不同答案,原因通常出在它的模式、它對輸入值的表示方式,或它執行捨入的階段,而不是任何一邊工具的錯誤。

為什麼二進位浮點數會破壞常見的捨入結果

一個常見的混淆來源,是數值 1.005。大多數試算表軟體與指令碼語言,都是以二進位浮點數的形式儲存十進位數字,而 1.005 的二進位表示法,並不完全等於 1.005。它實際上稍微小於這個數值,因此當這種語言把它乘以 100,再套用內建的四捨五入規則時,答案會變成 1.00,而不是預期中的 1.01。同樣的把戲,也會在 0.1、0.2 與 0.3 這類數值上重複出現,二進位捨入,可能會翻轉掉一個原本用十進位來看會很清楚的平手情況。

Rounding Calculator 之所以能避開這個陷阱,是因為它把十進位數字當成文字來讀取,並用整數運算來執行進位。實作範例:輸入 1.005,選擇 2 位小數,選擇四捨五入。被捨去的部分,是單一數字 5,計算工具會把它讀取為一個確切的平手情況,因為這些數字是被直接檢視的,而不是先經過近似處理。四捨五入,會把平手情況推離零,因此最後保留位置上的數值,會被加一。這個進位動作,只發生在小數部分之內,因為所要求精確度左邊的任何一個數字,都不需要改變,所以格式化後的輸出結果是 1.01。同樣的流程,套用在 999.999 上、取兩位小數,會在經過多位數的連鎖進位之後,得到 1000.00,而因為要求的是兩位小數,尾隨的零因此被保留下來。

這套整數運算的方法論,遵循的是Unicode Number Format specification,該規格描述了每一種模式的方向,以及處理平手情況時的數字層級規則。這些定義,說明的是計算規則本身;它們並不會替你選定一項業務政策。

捨入角落量測值時常見的錯誤

在實際專案中,大多數捨入方面的意外,都來自三個陷阱,而一旦你知道該注意什麼,每一個都很容易發現。

把負數的無條件捨去與直接截斷搞混。 這兩種模式,都是靠移除被捨去的數字來縮短一個數值,但它們只有在輸入為正數時,才會得到一致的結果。模式標籤,說明了方向上的差異:無條件捨去,會朝負無限大方向移動,因此在零位小數時,-1.21 會變成 -2;直接截斷,則會朝零的方向移動,因此同樣的輸入,會變成 -1。一個常見的捷徑想法,是把無條件捨去,理解成「直接刪掉多餘的數字」,但這種理解,只有在數值為正的時候才成立。這一點,在設計工作中很重要,因為一個負的偏移量,代表的是原點對面那一側的位置。

假設某一種模式永遠是正確的。 銀行家捨入之所以常被稱為「銀行家捨入法」,是因為當許多小規模的平手情況被獨立捨入時,它能降低累積出現的向上偏差。這個統計上的特性雖然有用,但並不代表銀行家捨入,就是每一個財務、法律、科學,或報告情境下正確的政策。請遵循你所屬組織或標準所規定的規則,而不要假設計算工具已經替你選好了。如果拿不定主意,四捨五入是最為人熟悉的選擇,也是一般量測工作最安全的預設值。

反覆對中間值進行捨入。 在一連串計算中,請在中間步驟保留完整的精確度,只在適用方法真正要求的那個階段才進行捨入。反覆對中間值捨入,可能會累積出與只在最終結果捨入不同的總和,而這個計算工具,一次只處理一個數字,因此維持這項紀律,是使用者自己的責任。這套方法論,明確區分了工具會執行的「改變呈現方式的捨入」,與工具不會計算的「有效數字」這兩件事。

其他需要留意的輸入限制:這個計算工具,最多接受 200 位數字,以及最多 20 位所要求的小數位數,開頭的零會被正規化,而結果數值為零時,不會顯示負號。它不會解析貨幣格式、不會套用像 0.05 這樣的現金捨入增量、不會轉換分數、不會傳遞量測不確定性、不會替你選擇稅務規則,也不保證符合任何外部政策。所有計算,都在瀏覽器本機完成,你輸入的數字不會被上傳,這在被捨入的數值屬於機密資訊時,格外重要。