財務報表中最令人頭痛的「分攤不平」、「明細加總 ≠ 彙總值」,根因在於 Excel 以 IEEE 754 雙精度浮點數運算(15 位有效數字),但顯示格式僅保留 2 位小數。SUM 函數使用完整精度運算,而非顯示值,導致「隱性誤差」累積。本文深度解析機制並提供標準解決方案。

| 項目 | 真實計算值(15位) | 顯示值(2位) | 說明 |
|---|---|---|---|
| 稅額 1 | 10.004999... | 10.00 | 實際 > 顯示 |
| 稅額 2 | 20.005001... | 20.01 | 實際 > 顯示 |
| 稅額 3 | 30.004999... | 30.00 | 實際 > 顯示 |
| SUM 真實總和 | 60.015... | 60.01 | 差異 0.005 |
| 手工加總顯示值 | - | 60.01 | 人工核對基準 |
Excel 內部用 60.015... 參與後續計算,報表呈現 60.01,造成對帳不符。
// 錯誤:只對最終結果 ROUND
=ROUND(SUM(C2:C100), 2)
// 正確:每筆明細計算時就 ROUND
=ROUND(單價 * 數量 * 稅率, 2)
// 正確:彙總時對已 ROUND 的明細 SUM
=SUM(ROUND(明細陣列, 2))
| 計算項目 | 公式範例 | 精度 |
|---|---|---|
| 單價 × 數量 = 金額 | =ROUND(B2*C2, 2) | 2 位 |
| 金額 × 稅率 = 稅額 | =ROUND(D2*E2, 2) | 2 位 |
| 金額 × 折扣率 = 折扣額 | =ROUND(D2*F2, 2) | 2 位 |
| 匯率換算 | =ROUND(外幣金額*匯率, 2) | 2 位(或依幣別) |
| 分攤計算 | =ROUND(總額*比例, 2) | 2 位 |
| 平均值 | =ROUND(AVERAGE(範圍), 2) | 2 位 |
Round2 = LAMBDA(x, ROUND(x, 2)) (Excel 365) 簡化公式⚠ 極度不建議:
Sub AutoAddRound()
Dim cell As Range
For Each cell In Selection
If cell.HasFormula Then
cell.Formula = "=ROUND(" & Mid(cell.Formula, 2) & ", 2)"
End If
Next
End Sub
將總額按比例分攤後,最後一筆用「總額 - 前面總和」確保完全吻合:
// 假設 A2:A10 為比例權重,B1 為總金額
C2 = ROUND(B1 * A2 / SUM($A$2:$A$10), 2)
C3 = ROUND(B1 * A3 / SUM($A$2:$A$10), 2)
...
C10 = B1 - SUM(C2:C9) // 最後一筆吸收所有捨入差異
=LET(
weights, A2:A10,
total, B1,
rounded, ROUND(total * weights / SUM(weights), 2),
last, total - SUM(DROP(rounded, -1)),
VSTACK(TAKE(rounded, -1), last)
)
| 現象 | 原因 | 範例 |
|---|---|---|
| 0.1 + 0.2 ≠ 0.3 | 二進位無法精確表示十進位小數 | =0.1+0.2 → 0.30000000000000004 |
| 大數吃小數 | 有效數字限制 15 位 | =123456789012345 + 0.1 → 123456789012345 |
| 減法消失 | 相近大數相減丟失有效位 | =1.0000001 - 1.0000000 → 9.99999E-08 |