1. 前言
Python 是一種廣泛應用於數據分析與機器學習等領域的程式語言。在日常程式設計中,「數值的四捨五入」是一個常見的操作。例如,我們經常需要將數字四捨五入到特定的小數位數,或是近似為整數。
本文將詳細介紹在 Python 中執行四捨五入的多種方法,從內建的 round()
函數,到可提供更精確計算的 Decimal
模組,依照不同的需求選擇適合的方法。
透過這份指南,您將能夠提升數值處理的精度,並提高程式碼的可靠性。
2. 什麼是 Python 的四捨五入?
在 Python 中,四捨五入是一種將數字轉換為最接近的整數,或是四捨五入至特定位數的操作。這在數據處理與數值計算時非常重要。例如,在財務數據或物理計算等需要高精度的場合,數值的四捨五入方式可能會影響最終結果。
Python 提供了內建的 round()
函數來執行四捨五入,但該函數存在一定的限制,特別是在處理浮點數時,需要注意其精度問題。若要獲得更準確的計算結果,建議使用 Python 的 Decimal
模組。
在接下來的章節中,我們將以 round()
函數為例,介紹四捨五入的基本方法。

3. round()
函數的基本用法
round()
函數的基本使用方式
round()
是 Python 內建的函數,可用於對數值進行四捨五入。基本的使用方式如下:
print(round(1.5)) # 輸出: 2
print(round(2.5)) # 輸出: 2
在這個例子中,1.5 被四捨五入為 2,2.5 也被四捨五入為 2。Python 的 round()
函數預設採用「銀行家四捨五入」(Banker’s Rounding),即當數值的尾數是 0.5 時,會四捨五入到最接近的偶數。
指定小數位數進行四捨五入
透過 round()
函數的第二個參數,可以指定小數點後的位數。例如:
print(round(1.456, 2)) # 輸出: 1.46
此範例中,數值 1.456 在小數點後第 3 位進行四捨五入,並保留到第 2 位小數。
round()
函數的注意事項
然而,使用 round()
時需要特別注意,因為 Python 的浮點數(float
)存儲方式可能會導致誤差。例如:
print(round(2.675, 2)) # 輸出: 2.67 (預期結果可能是 2.68)
這是由於浮點數的精度問題所導致的。在需要更高精度的計算時,建議使用 Decimal
模組來解決此類問題。
接下來的章節將詳細介紹 Decimal
模組及其應用。
4. 使用 Decimal 模組進行精確四捨五入
什麼是 Decimal 模組?
Python 的 Decimal
模組專為解決浮點數(float
)精度問題而設計。它特別適用於金融計算、科學計算等需要高精度的場合。Decimal
提供準確的十進制運算,能有效避免浮點數誤差。
例如,當我們使用 float
進行運算時,可能會遇到以下問題:
print(0.1 + 0.2) # 輸出: 0.30000000000000004
這樣的結果可能導致計算誤差。然而,透過 Decimal
,可以獲得更精確的結果:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # 輸出: 0.3
Decimal
物件的建立方式
Decimal
物件可以透過將數字作為字串傳入來建立,這樣可以確保精確的數值運算。例如:
from decimal import Decimal
d = Decimal('1.456')
print(d) # 輸出: 1.456
使用 quantize()
進行四捨五入
Decimal
提供 quantize()
方法,可用於指定小數位數進行四捨五入,並且可以選擇不同的四捨五入方式。例如,常見的四捨五入模式 ROUND_HALF_UP
(傳統的四捨五入)如下:
from decimal import Decimal, ROUND_HALF_UP
d = Decimal('1.456')
rounded = d.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
print(rounded) # 輸出: 1.46
Decimal 模組的優勢與適用場景
Decimal
模組特別適用於金融計算和需要極高精度的數據處理。例如,在金融領域,即使是 0.01 元的誤差都可能影響計算結果,因此 Decimal
是首選方案。此外,在科學數據分析中,為了確保結果的精確性,也建議使用 Decimal
。
5. math.floor()
和 math.ceil()
的介紹
math.floor()
的使用方法
math.floor()
函數會回傳小於或等於指定數值的最大整數。換句話說,它的作用是「無條件捨去」(向下取整)。例如,將 3.9 捨去後會得到 3:
import math
print(math.floor(3.9)) # 輸出: 3
floor()
適用於需要捨去小數部分並轉換為整數的場景。
math.ceil()
的使用方法
與 math.floor()
相反,math.ceil()
會回傳大於或等於指定數值的最小整數,這稱為「無條件進位」(向上取整)。例如,將 3.1 進位後會得到 4:
import math
print(math.ceil(3.1)) # 輸出: 4
floor()
和 ceil()
的適用場景
floor()
和 ceil()
主要用於統計分析、遊戲開發等需要進行數值捨去或進位的情境。例如,在計算折扣後的價格時,通常需要使用 floor()
來確保價格不超過消費者預期,而在計算商品包裝數量時,可能會使用 ceil()
來確保包裝數量足夠。
與 round()
相比,這兩個函數適用於需要「絕對捨去」或「絕對進位」的場景,而不是四捨五入。
6. 組合不同方法的進階應用
建立自訂函數
透過組合 round()
、floor()
、ceil()
以及 Decimal
模組,可以根據不同需求設計自訂的數值處理函數。例如,以下函數會先將數值四捨五入至指定小數位數,然後進行無條件進位:
import math
def custom_round(value, digits):
rounded_value = round(value, digits)
return math.ceil(rounded_value)
print(custom_round(1.456, 2)) # 輸出: 2
這樣的自訂函數可以適用於需要「先四捨五入,然後無條件進位」的場景,例如計算總支付金額時,確保最終金額不低於某個整數。
結合 Decimal
進行更精確的運算
在財務或科學計算中,我們可以使用 Decimal
來確保數值運算的精度。例如,計算總價時,我們可以先四捨五入到小數第二位,然後無條件進位:
from decimal import Decimal, ROUND_HALF_UP
import math
def precise_round(value, digits):
d = Decimal(str(value))
rounded = d.quantize(Decimal('0.' + '0' * (digits - 1) + '1'), rounding=ROUND_HALF_UP)
return math.ceil(rounded)
print(precise_round(1.456, 2)) # 輸出: 2
這種方式適用於財務計算,例如稅額計算或總價計算,確保結果的準確性。
不同方法的比較
以下是 round()
、floor()
、ceil()
和 Decimal
在不同情境下的比較:
方法 | 運算邏輯 | 適用場景 |
---|---|---|
round() | 四捨五入(預設為銀行家四捨五入) | 一般數值計算,非財務應用 |
math.floor() | 無條件捨去(向下取整) | 統計計算、價格折扣、數據分組 |
math.ceil() | 無條件進位(向上取整) | 包裝計算、計票數、確保數量充足 |
Decimal | 精確計算,可指定不同的四捨五入規則 | 財務計算、科學運算、稅額計算 |

7. 常見問題(FAQ)
1. 什麼時候應該使用 round()
函數?
round()
函數是 Python 最簡單的數值四捨五入方法,適用於一般的數值計算,特別是處理浮點數或整數時。但需要注意的是,round()
預設採用「銀行家四捨五入」(Banker’s Rounding),當數值的尾數為 0.5 時,會四捨五入到最接近的偶數。
例如,以下程式碼會將數字四捨五入至小數點後兩位:
print(round(1.456, 2)) # 輸出: 1.46
2. 什麼時候應該使用 Decimal
模組?
Decimal
模組適用於需要極高精度的數值計算,特別是在財務或科學計算領域。例如,在金融交易中,即使是 0.01 的誤差也可能影響結果,因此使用 Decimal
可以確保計算的準確性。
以下範例顯示了如何使用 Decimal
進行精確的計算:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # 輸出: 0.3
3. 如果四捨五入結果與預期不符,應該怎麼辦?
如果 round()
的結果與預期不符,首先需要檢查是否受到了「銀行家四捨五入」的影響。如果希望使用一般的四捨五入(例如 0.5 以上進位),可以改用 Decimal
並指定 ROUND_HALF_UP
模式:
from decimal import Decimal, ROUND_HALF_UP
d = Decimal('1.25')
print(d.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)) # 輸出: 1.3
8. 總結
本文詳細介紹了 Python 中數值四捨五入的各種方法。
round()
函數適用於一般用途,但需要注意「銀行家四捨五入」的影響。math.floor()
和math.ceil()
可分別用於無條件捨去與無條件進位。Decimal
模組適用於財務與科學計算,能確保計算結果的精確性。
根據不同的應用場景,選擇最適合的方法,確保數值計算的準確性與可靠性。
9. 相關文章與參考資料
如果想進一步學習 Python 中的數值處理,建議參考以下資源:
- Python 官方文件 –
round()
函數
Python 標準函數round()
的官方文檔,詳細說明了其用法與「銀行家四捨五入」的機制。
Python 官方文件 – round() - Python 官方文件 –
decimal
模組
decimal
模組的官方文檔,介紹了如何使用quantize()
來實現不同的四捨五入方法。
Python 官方文件 – decimal - 四捨五入的詳細介紹 – note.nkmk.me
一篇詳細介紹 Python 中四捨五入的文章,涵蓋了round()
和decimal
的使用範例,適合初學者學習。
Python 四捨五入方法
透過這些資源,您可以進一步學習 Python 數值處理的技巧,並選擇最適合您的應用方法。