首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python round() 函數完整指南:四捨五入、銀行家演算法、精度陷阱與替代方案

     編輯:更多程式設計知識

round(number[, ndigits]) 將數值四捨五入到指定小數位數。Python 3 採用「銀行家演算法」(Round half to even),即 .5 進位到最近的偶數,這與傳統「四捨五入」不同。本文詳細說明語法、行為、精度陷阱、Decimal 精確替代與實務建議。

函數簽名


round(number, ndigits=None)
# ndigits 省略或 None -> 回傳 int(最接近的整數)
# ndigits >= 0 -> 回傳 float,保留 ndigits 位小數
# ndigits < 0 -> 以 10 的冪次為單位捨入(十位、百位...)

基本範例


print(round(80.23456, 2))      # 80.23
print(round(100.000056, 3))    # 100.0
print(round(-100.000056, 3))   # -100.0
print(round(1.5))              # 2
print(round(2.5))              # 2  ← 銀行家演算法:進到偶數
print(round(3.5))              # 4
print(round(1234, -2))         # 1200 (百位捨入)

銀行家演算法說明

  • 當小數部分恰好為 .5 時,進位到最近的偶數(最低有效位為偶數)。
  • 目的:減少大量資料累積的統計偏差(傳統四捨五入總是進位,長期偏大)。
  • IEEE 754 預設模式,金融、科學計算標準。

浮點數精度陷阱


# 看似 2.675 應進位到 2.68,實際輸出 2.67
print(round(2.675, 2))  # 2.67

# 原因:2.675 無法用二進位精確表示,實際儲存值略小
print(format(2.675, '.20f'))  # 2.67499999999999982236

精確替代:decimal.Decimal


from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

# 传统四捨五入 (ROUND_HALF_UP)
d = Decimal('2.675')
print(d.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))  # 2.68

# 银行家演算法 (ROUND_HALF_EVEN) - 与 round() 一致
print(d.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN))  # 2.68 (Decimal 精確表示)

# 金融常用:固定兩位小數,四捨五入
def money_round(value):
    return Decimal(str(value)).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)

常見用法與陷阱

需求建議做法
一般顯示用途round(x, 2) 或 f"{x:.2f}"
金融/會計金額務必用 Decimal,指定 ROUND_HALF_UP
統計/科學計算round (銀行家) 可接受,或用 NumPy np.round
避免浮點誤差顯示格式化字串 format(x, '.2f') 自動處理
ndigits 為負數捨入到十位、百位等,如 round(1234, -1) == 1230

Python 2 vs 3 差異

  • Python 2 round 採傳統四捨五入(.5 總是進位),回傳 float。
  • Python 3 採銀行家演算法,ndigits 省略時回傳 int。
  • 移植代碼時需注意此行為差異。

效能

  • round 為 C 實作,極快。
  • Decimal 較慢(約 10-100 倍),僅用於精度關鍵路徑。
  • 大量陣列用 numpy.round 或 np.ndarray.round。

理解 round() 的銀行家演算法與浮點數表示限制,並在金融場景堅持使用 Decimal,是寫出正確數值代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved