> ## Documentation Index
> Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 结算计算详解

> 逐行复现 Waffo 的结算数字：四个清算步骤、2 位与 6 位小数精度设置、每种币种组合使用哪个货币对和取整规则、最小和最大手续费上限如何应用、什么是 Return Fee，以及为什么负数结算周期不付款。

本页面向这样的情形：您试图**自己复现某个结算数字**，
而您的算术与我们的不一致。它自下而上展开：一笔
交易、四个步骤，然后是适用于您特定币种组合的取整和货币对。

报表层面的视图——哪一列来自哪里、如何导出、
为什么文件可能缺失——见
[结算报表与导出](/docs/zh/support/settlement-reports-faq)。资金流动的日期，
见[结算周期与日历](/docs/zh/support/settlement-cycle-faq)。
资金落入的余额，见
[余额与账户历史](/docs/zh/support/balance-and-account-history-faq)。

## Waffo 是怎么从我的订单金额算到结算金额的？

每笔交易都经过相同的四个步骤，顺序如下：

| 步骤 | 发生什么 | 结果 |
| - | - | - |
| 1 | **清算金额**——订单金额换算为您的结算币种 | `Order Amount (Settlement Currency)` |
| 2 | **内扣税费**——计算交易税（VAT 和/或预扣税）并从清算金额中扣除 | `Tax Amount`（无论哪种税，报表列都标为 `Tax Amount`） |
| 3 | **内扣手续费**——计算处理手续费并从清算金额中扣除 | `Fee Amount` |
| 4 | **净结算**——剩余部分 | `Settlement Amount` |

```
Settlement Amount = Clearing amount − tax deducted − fee deducted
```

对账时这一顺序的两个性质很重要：

* **税费和手续费是内扣的（从订单金额中扣除），不是外加的。**
  税和手续费计算的基数都是交易时的订单金额，
  而不是扣除另一项之后的净额。它们不复合计算。
* \*\*先产生清算金额，然后税和手续费各自通过
  自己的货币对计算。\*\*所以以第三种币种计费的手续费不是
  从已换算的结算数字推导的——见下方
  各情形表。

## 我的结算用几位小数精度？能改吗？

`Settlement Decimal Place` 在您签约时设置在商户档案上。
它有两个可能的值——**2 位小数**或 **6 位小数**——
且**之后不能更改**。

| 值 | 明细报表中的手续费、税费和清算金额 | 手续费取整 | Settlement Amount |
| - | - | - | - |
| 2 位小数 | 2 位小数 | **向上**取整（`ROUNDUP2`） | 2 位小数 |
| 6 位小数 | 6 位小数，补零 | 6 位小数**四舍五入** | 明细文件 6 位小数；批次层面 2 位小数 |

无论哪种设置：

* **汇率始终为 8 位小数**，汇率位数不足时补零。
* \*\*结算汇总数字始终为 2 位小数。\*\*资金以
  2 位小数流动。

如果您是 6 位小数，明细行之和与批次金额精确到分一致，
因为 6 位小数之和与 2 位小数批次数字之间的
尾差被明确记录，而不是被静默丢弃：

```
6-decimal total = 2-decimal batch amount + residual
```

如果您是 2 位小数，每行在求和前已取整到 2 位小数，
所以小额交易是您与 6 位小数计算相对差异
最大的地方——这正是 6 位小数选项
存在的原因。

## 我的交易适用哪个货币对和哪条取整规则？

涉及三种币种：您的**订单币种**、您合同计费的**手续费币种**，
以及您的**结算币种**。用哪个货币对、
发生几次换算，仅取决于三者中哪些相等。

面向客户的取整规则，在 **2 位小数**账户上适用如下：

| 规则 | 含义 |
| - | - |
| `ROUND2` | 四舍五入到 2 位小数 |
| `ROUNDUP2` | **向上**取整到 2 位小数 |
| `ROUNDDOWN2` | **向下**取整到 2 位小数 |

在 **6 位小数**账户上，手续费（以及固定的拒付和失败手续费）
在 **6 位小数四舍五入**而不是向上取整——向上取整规则的存在是为了
保护 2 位小数的数字不被少收，而在 6 位小数下尾差
会被记录。下面情形表中凡写 `ROUNDUP2` 之处，如果您是 6 位小数账户，
请读作"6 位小数四舍五入"。

### 情形 A——订单 = 手续费 = 结算币种

无换算。`Forex Currency Pair` 和 `Forex Rate` 为空。

| | 公式 |
| - | - |
| `FeeAmount(SettlementCurrency)` | `ROUNDUP2(OrderAmount * feeRate)` |
| `FeeAmount` | `= FeeAmount(SettlementCurrency)` |
| `OrderAmount(SettlementCurrency)` | `= OrderAmount` |
| `PAYMENT` Settlement Amount | `OrderAmount(SettlementCurrency) − FeeAmount(SettlementCurrency) − TaxAmount(SettlementCurrency)` |
| `REFUND` Settlement Amount | `− OrderAmount(SettlementCurrency) − FeeAmount(SettlementCurrency) − TaxAmount(SettlementCurrency)` |
| `CHARGEBACK` Settlement Amount | `− OrderAmount(SettlementCurrency) − FeeAmount(SettlementCurrency)` |

示例，使用示意性的 2% 费率（非报价费率），所有币种均为 USD：

| 类型 | Order Amount | Fee Amount | Settlement Amount |
| - | - | - | - |
| `PAYMENT` | 100.00 | 2.00 = `ROUNDUP(100.00 × 2%, 2)` | 98.00 |
| `REFUND` | 50.00 | 1.00 = `ROUNDUP(50.00 × 2%, 2)` | −51.00 |
| `CHARGEBACK` | 50.00 | 10.00（按该案件报告的金额） | −60.00 |

### 情形 B——订单 = 手续费币种，结算币种不同

`Forex Currency Pair = SettlementCurrency/OrderCurrency`

| | 公式 |
| - | - |
| `FeeAmount(SettlementCurrency)` | `ROUNDUP2(OrderAmount * feeRate / forexRate)` |
| `FeeAmount` | `ROUND2(OrderAmount * feeRate)` |
| `OrderAmount(SettlementCurrency)` | `ROUND2(OrderAmount / forexRate)` |
| `CHARGEBACK` 手续费换算 | `FeeAmount(SettlementCurrency) = ROUNDUP2(FeeAmount / forexRate)` |

示例，使用示意性的 2% 费率，订单和手续费为 USD，结算为 HKD，货币对 `HKD/USD` 汇率
`0.12770000`：

| 类型 | Order Amount | Order Amount (Settlement Currency) | Fee Amount | Fee Amount (Settlement Currency) | Settlement Amount |
| - | - | - | - | - | - |
| `PAYMENT` | 100.00 | 783.09 = `ROUND(100 / 0.1277, 2)` | 2.00 | 15.67 = `ROUNDUP(100 × 2% / 0.1277, 2)` | 767.42 |
| `REFUND` | 50.00 | 391.54 | 1.00 | 7.84 | −399.38 |
| `CHARGEBACK` | 50.00 | 391.54 | 10.00 | 78.31 = `ROUNDUP(10 / 0.1277, 2)` | −469.85 |

### 情形 C——手续费币种不同，订单 = 结算币种

`Forex Currency Pair = SettlementCurrency/FeeCurrency`

| | 公式 |
| - | - |
| `FeeAmount(SettlementCurrency)` | `ROUNDUP2((OrderAmount * forexRate) * feeRate / forexRate)` |
| `FeeAmount` | `ROUND2((OrderAmount * forexRate) * feeRate)` |
| `OrderAmount(SettlementCurrency)` | `= OrderAmount` |

这是让人意外的情形：您的订单币种等于
结算币种，但 `Forex Currency Pair` 和 `Forex Rate` 却有值，
因为**手续费**需要换算。这里的 `feeRate` 也可能带有最小值
或固定部分。

示例，使用示意性的 2% 费率，订单和结算为 HKD，手续费为 USD，货币对 `HKD/USD` 汇率
`0.12770000`：

| 类型 | Order Amount | Fee Amount | Fee Amount (Settlement Currency) | Settlement Amount |
| - | - | - | - | - |
| `PAYMENT` | 100.00 | 0.26 = `ROUND(100 × 0.1277 × 2%, 2)` | 2.00 | 98.00 |
| `REFUND` | 50.00 | 0.13 | 1.00 | −51.00 |
| `CHARGEBACK` | 50.00 | 10.00 | 78.31 = `ROUNDUP(10.00 / 0.1277, 2)` | −128.31 |

### 情形 D——订单币种不同，手续费 = 结算币种

`Forex Currency Pair = SettlementCurrency/OrderCurrency`

| | 公式 |
| - | - |
| `FeeAmount(SettlementCurrency)` | `ROUNDUP2(OrderAmount / forexRate * feeRate)` |
| `FeeAmount` | `= FeeAmount(SettlementCurrency)` |
| `OrderAmount(SettlementCurrency)` | `ROUND2(OrderAmount / forexRate)` |
| `CHARGEBACK` 手续费换算 | 无——`FeeAmount(SettlementCurrency) = FeeAmount` |

示例，使用示意性的 2% 费率，订单为 HKD，手续费和结算为 USD，货币对 `USD/HKD` 汇率
`7.83010000`：

| 类型 | Order Amount | Order Amount (Settlement Currency) | Fee Amount | Settlement Amount |
| - | - | - | - | - |
| `PAYMENT` | 100.00 | 12.77 = `ROUND(100 / 7.8301, 2)` | 0.26 | 12.51 |
| `REFUND` | 50.00 | 6.39 | 0.13 | −6.52 |
| `CHARGEBACK` | 50.00 | 6.39 | 10.00 | −16.39 |

### 情形 E——订单、手续费和结算币种全部不同

需要两个货币对：`SettlementCurrency/OrderCurrency` 用于产生清算
金额，`SettlementCurrency/FeeCurrency` 用于产生手续费。两者互不
推导：

```
Fee Amount (fee currency)        = round[ (OrderAmount / rateOrder * rateFee) * feeRate ]
Fee Amount (settlement currency) = round[ (OrderAmount / rateOrder * rateFee) * feeRate / rateFee ]
```

因为手续费币种汇率同时出现在结算币种数字的分子和分母中，
**相对于您清算金额的有效手续费百分比
始终等于您的合同费率**——不会被双重换算侵蚀。
对账三币种账户时值得核对这一点：把 `Fee Amount (Settlement Currency)` 除以
`Order Amount (Settlement Currency)`，您应该得到合同费率，
仅受取整影响。

## 为什么我的手续费不等于费率 × 金额？（最小和最大手续费）

您的合同可能带有 `minFee`，以及 `maxFee`（绝对上限）或
`maxFeeRatio`（百分比上限）之一。\*\*`maxFee` 和 `maxFeeRatio` 永远不会同时应用
于同一手续费项。\*\*检查按固定顺序运行，触发的检查
会*替换*计算出的手续费，而不是调整它：

1. \*\*先检查 `minFee`。\*\*如果以手续费币种计算的手续费
   低于 `minFee`，则手续费币种和结算币种两个数字都
   从 `minFee` 重新计算，**向上**取整。重新计算以原始
   `minFee` 值为输入，而不是已取整的计算手续费。
2. **然后检查最大值**——您合同中带有的那一个。
   * `maxFee`：如果以手续费币种计算的手续费超过 `maxFee`，两个
     数字都从 `maxFee` 重新计算，**向下**取整。
   * `maxFeeRatio`：如果 `扣除的手续费（结算币种）/ 清算金额
     （结算币种）` 超过 `maxFeeRatio`，两个数字都重新计算为
     订单金额乘以 `maxFeeRatio`，**向下**取整。

所以触及下限的手续费向上取整，触及上限的手续费
向下取整。`minFee` 在合同中始终为 2 位或更少小数，所以
应用时不需要自己再取整。

对小额交易的实际影响：低于某个订单
金额后，您的手续费不再成比例，而是固定为 `minFee`，
有效百分比随票面金额下降而上升。这是"这笔交易的手续费看起来不对"
最常见的单一原因。

## 什么是 Return Fee？怎么计算？

**Return Fee** 在您退款时把*原支付手续费*的一部分退还给您。
它只在您的合同包含时才存在——默认是**不**退手续费的退款，
见
[退款 FAQ](/docs/zh/support/refund-faq)。

在适用的情况下，退款行的结算金额会加上它作为**正向**
组成部分：

```
Settlement Amount = − OrderAmount(SettlementCurrency)
                    − FeeAmount(SettlementCurrency)
                    − TaxAmount(SettlementCurrency)
                    + ReturnFeeAmount(SettlementCurrency)
```

两个数字都按比例计算，并使用**不同的取整规则**：

```
ReturnFeeAmount                     = ROUNDDOWN2( RefundOrderAmount / OriginalOrderAmount × OriginalFeeAmount )
ReturnFeeAmount(SettlementCurrency) = ROUND2( ReturnFeeAmount / OriginalFeeAmount × OriginalFeeAmount(SettlementCurrency) )
```

请仔细读第二个公式：结算币种的退还是按**已向下取整的**手续费币种退还
按比例计算的，而不是从退款比例重新计算。这就是
手续费以第三种币种计费时让两个数字保持一致的原因。

示例，使用示意性费率——所有币种 USD，支付手续费 2%，退款手续费 0%，
Return Fee 按比例：

| 类型 | Order Amount | Fee Amount | Settlement Amount |
| - | - | - | - |
| `PAYMENT` | 100.00 | 2.00 | 98.00 |
| `REFUND` | 50.00 | **−1.00** = `ROUNDDOWN((50.00 / 100.00) × 2.00, 2)` | **−49.00** = `−50.00 + 1.00` |

两点注意：

* 退款行的 `Fee Amount` 为**负数**。那是 Return Fee，不是
  收费——退款行上的负手续费是预期的，不是数据错误。
* 退款自身的手续费（`refund fee rate`）和 Return Fee 是不同的
  合同项。一笔退款可以既带退款手续费*又*退还部分
  支付手续费。

向下取整意味着退还金额可能比直接按比例计算
低一分钱。全额退款时比例为 1，整个原手续费
全部退回。

## 退款时 VAT 会退给我吗？

\*\*不会。\*\*退款不退还 VAT。在上述清算步骤中，退款交易
直接跳过税费步骤——反向环节没有 VAT 计算，
所以没有什么可退。

这与支付手续费问题是分开的：如果您的合同带有 Return Fee，支付手续费*可能*
退回，但税费在任何合同配置下
都不退。

## 手续费币种能变吗？可以是什么？

手续费币种必须是**您的结算币种或订单
币种之一**，且**不能在同一天内更改**——该请求会被
校验拒绝。这就是为什么上述五种情形对单笔交易
在实践中是穷尽的。

## 我的结算周期净额为负，会怎样？

那天没有资金流动，也没有任何东西被核销。

* 只有净结算金额**大于零**时才会发起结算。
  退款和拒付超过支付的周期不会产生
  付款，也没有资金转账。
* 负金额**向后结转并累积**。它被加到
  下一个周期，再下一个，直到累计总额转正——此时
  整个累计金额作为**一笔**转账结算。
* 当把周期推为负数的是拒付时，同样的规则适用：
  拒付不会向任何其他账户收取，只是等待之后的
  交易。

一个示例形态：连续四个负数结算日后跟一个正数
结算日，不会产生四笔转账和一次更正。它们产生一笔
转账，金额为五个周期的净额，在总额转正的那天。全部五条
结算记录都指向那一笔转账，所以您可以把转账
对回它覆盖的每个周期。

因此，**结算日没有到账不一定是
错误**。结算日过了却没有资金到达的其他原因，见
[结算周期与日历](/docs/zh/support/settlement-cycle-faq)。

## 为什么批次总额不等于我明细行之和？

应该相等——但只有在正确的层级做了正确的取整之后。汇总
是明细行求和后**在最后取整一次**：

```
Summary Settlement Amount = ROUND2( Σ Settlement Amount in the settlement details report )
```

如果您先把每个明细行取整到 2 位小数再相加，
每行会与我们的数字偏差最多半分。请全精度求和，最后
取整。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.