匯率精度不同於金額精度
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 模組可以從字串建立十進位值,並將結果量化為指定增量。以下本機範例模擬兩位小數的銀行家捨入法金額計算;它不會取得即時匯率。
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 欄位不同,請比較輸入金額、完整回傳匯率、目標最小單位和捨入模式。在認定結果錯誤前,先檢查這些項目。
即使沒有買賣價差,將捨入後的金額換回原貨幣,也可能損失少量金額。批次處理時,先逐筆捨入再加總,也可能不同於先加總未捨入的金額再捨入一次。請採用應用程式所需的規則,並一致地記錄。
來源與參考
發布日期: 。最近審閱日期: 。

