匯率精度與捨入

維持十進位匯率的精確度,貨幣金額只捨入一次,並透過可重現的 Python 範例了解銀行家捨入法。

一頭白色獨角鯨在算盤與一盤貨幣代幣旁。

匯率精度不同於金額精度

USD 金額可能只顯示兩位小數,但計算所用的匯率可能需要多保留數位。為配合貨幣顯示格式而截短匯率,會改變每次換算的輸入值。

使用 EUR 兌 USD 的範例匯率 1.08765 換算 EUR 250,捨入前為 USD 271.91250,捨入至兩位小數則為 USD 271.91。若先將匯率捨入為 1.09,結果會是 USD 272.50,顯示的金額相差 59 美分。

銀行家捨入法如何處理恰好位於中點的數值

當數值恰好位於兩個相鄰捨入結果的中點時,銀行家捨入法會選擇最後保留位數為偶數的結果。保留兩位小數時,1.005 變成 1.00,1.015 則變成 1.02。此規則與遇到中點時一律向上捨入不同。

這些都是精確的十進位範例。略高於或低於中點的數值,都不屬於恰好位於中點的情況。捨入模式必須納入計算規則,不能任由格式化函式決定。

直接解析十進位字串

Python 的 decimal 模組可以從字串建立十進位值,並將結果量化為指定增量。以下本機範例模擬兩位小數的銀行家捨入法金額計算;它不會取得即時匯率。

可執行的 Python 範例
from decimal import Decimal, ROUND_HALF_EVEN, localcontext

with localcontext() as ctx:
    ctx.prec = 40
    amount = Decimal("250.00")
    rate = Decimal("1.08765")
    result = (amount * rate).quantize(
        Decimal("0.01"), rounding=ROUND_HALF_EVEN
    )

print(result)  # 271.91

選擇貨幣的最小單位

不要對每種目標貨幣都套用兩位小數。Narwhal 的換算操作使用目標貨幣在 ISO 4217 中的最小單位。例如,文件中的 USD 兌 JPY 回應會回傳以整數日圓表示的換算金額。

使用目前的貨幣中繼資料或換算端點回傳的金額。現金面額捨入、商家顯示規則和會計政策可能另有要求;這些規則應明確選定,並與匯率精度分開處理。

避免不必要的精度損失

透過二進位浮點數轉換十進位字串,可能在十進位函式庫看到它之前遺失資訊。在 API 邊界保留原始字串,並為最大支援金額和匯率選擇足夠的十進位工作精度。

  • 保留接收的匯率字串,以便稽核和重現。
  • 在工作精度下進行中間乘除;只對最終金額捨入一次。
  • 指定捨入模式和目標增量。
  • 只為顯示進行格式化,絕不要把格式化標籤重新用於計算。

使用相同輸入核對

如果本機計算與 Narwhal 的 converted 欄位不同,請比較輸入金額、完整回傳匯率、目標最小單位和捨入模式。在認定結果錯誤前,先檢查這些項目。

即使沒有買賣價差,將捨入後的金額換回原貨幣,也可能損失少量金額。批次處理時,先逐筆捨入再加總,也可能不同於先加總未捨入的金額再捨入一次。請採用應用程式所需的規則,並一致地記錄。

來源與參考

發布日期: 。最近審閱日期: 。