# 折旧摊销计算

> **菜单入口**：工具 → 折旧摊销计算
>
> **更新日期**：2026 年 8 月 30 日
>

## 界面

![image-20240816103422041](https://guaishoudejia.com/assets/img/image-20240816103422041.png)

## 操作提示

- 明显表按照标题填入对应的内容；
- 序号，要求需要不重复；
- 检查购置日期，是标准的日期格式，中文需要 有 “XXXX年 XX月 XX日”，英文为短横链接。
- 残值率，应该为数值，不可以是字符串。可以改成小数。
- 长期待摊摊销计算，残值率为 0，且经济寿命设置为 1000 年（即不需要再次更新支出）。
- 各类比例暂时不用填写，还没有开放此功能；
- 预测期内更新，表示如果经济寿命正好在预测期内结束，会计算一笔更新的资本性支出（如果自行测算更新支出，可以不 ☑️ ）
- 设备编号填写“在建工程转固”如果购置日期在基准日后，首次资本性支出记作"0";
- 经济寿命：为资产理论使用寿命，也是资产更新周期。

## 理论依据

《中国资产评估》2021 年第8期

![image-20240816104246245](https://guaishoudejia.com/assets/img/image-20240816104246245.png)

## 计算过程

![image-20240816103852721](https://guaishoudejia.com/assets/img/image-20240816103852721.png)

## 计算逻辑详解

> 对应实现：`DepreciationClass.cs` 中的 `DtailItemClass` 构造函数

折旧计算分为**预测期**与**永续期**两个阶段，永续期按"剩余使用年限是否超过经济寿命年限"再分两个分支处理：

```mermaid
flowchart TD
    Start(["开始计算 DtailItemClass"]) --> Init["读取设备参数<br/>原值/净值/折旧年限/经济寿命/残值率<br/>计算 MonthlyDepreciation、ResidualValue"]
    Init --> Adj["购置日期 DateOfPayment 调整<br/>(购置日期 早于 支出日期时，按经济寿命周期对齐到支出周期)"]
    Adj --> Pre["预处理：t / diffInTime<br/>TheRemainingDepreciableYears、TheRemainingUsefulLife"]
    Pre --> InitPool["初始化支出池<br/>TheAmountOfDepreciationThatIsStillAvailable<br/>= 净值 - 残值（购置>基准 则=0）"]
    InitPool --> Loop{"预测期逐月循环<br/>i < months"}
    Loop -->|"逐月"| MonthDep["本月折旧 = Min(MonthlyDepreciation, 池子余额)<br/>池子 -= MonthlyDepreciation"]
    MonthDep --> MonthExp["判断本月是否命中 重置支出点<br/>命中则支出 = 原值*(1-残值率)或原值全值<br/>并 池子 += 支出金额"]
    MonthExp --> Loop
    Loop -->|"预测期结束"| Branch{"TheRemainingUsefulLife<br/>> EconomicYears?"}

    Branch -->|"是：会到经济寿命、会触发重置支出"| OneShot["支出池剩余<br/>折成等价永续年度折旧额"]
    Branch -->|"否：未到经济寿命、不会重置支出"| Perp["支出池剩余<br/>按剩余折旧期拆流后再折现"]

    OneShot --> FinalYes["永续期折旧 = 支出池剩余 × 折现率<br/>+ 重置支出现值年金"]
    Perp --> FinalNo["永续期折旧 = 剩余余额拆流折现额<br/>+ 下一周期永续年金额"]

    FinalYes --> End(["输出结果"])
    FinalNo --> End
```

### 一、预测期逐月循环逻辑

```mermaid
flowchart TD
    M0(["进入当月迭代"]) --> DepCheck{"支出池余额 > 0<br/>且 当月 > 折旧起算日?"}
    DepCheck -->|"是"| DepMin["本月折旧 = Min(MonthlyDepreciation, 池子余额)"]
    DepCheck -->|"否"| DepZero["本月折旧 = 0"]
    DepMin --> PoolDec["池子 = Max(0, 池子 - MonthlyDepreciation)<br/>(注意：用 MonthlyDepreciation，不是折旧额)"]
    DepZero --> PoolDec
    PoolDec --> HitExp{"命中重置支出点?<br/>diff mod (经济寿命*12)=0<br/>购置月 <= 当月"}

    HitExp -->|"是"| ExpBranch{"购置 > 基准 且 firstrun?"}
    ExpBranch -->|"是 首次全值"| ExpFull["支出金额 = 原值（不扣残值）<br/>firstrun = false"]
    ExpBranch -->|"否 后续重置"| ExpNet["支出金额 = 原值*(1-残值率)"]
    HitExp -->|"否"| ExpZero["支出金额 = 0"]

    ExpFull --> NoUpdate{"预测期内是否<br/>允许更新投资?"}
    ExpNet --> NoUpdate
    ExpZero --> NextIter

    NoUpdate -->|"不允许 且 命中支出"| Clear["清零本次支出<br/>并把 RemainingUsefulLife / DepreciableYears 置 0"]
    NoUpdate -->|"允许 或 未命中"| PoolInc{"支出 > 0?"}
    Clear --> NextIter

    PoolInc -->|"是"| PoolAdd["池子 += 支出金额<br/>（在建工程转固特殊处理：首支出清零）"]
    PoolInc -->|"否"| NextIter(["下一个月"])
    PoolAdd --> NextIter
```

**关键变量含义：**

| 变量                                            | 含义                                                                                   |
| ----------------------------------------------- | -------------------------------------------------------------------------------------- |
| `TheAmountOfDepreciationThatIsStillAvailable` | **支出池**，即可折旧余额，初始为 `净值 - 残值`；命中支出时累加，每月折旧时扣减 |
| `MonthlyDepreciation`                         | 月折旧额 =`(原值 - 残值) / (12 * 折旧年限)`                                          |
| `TheRemainingUsefulLife`                      | 剩余使用年限，基于经济寿命和日期差                                                     |
| `TheRemainingDepreciableYears`                | 剩余折旧年限，基于折旧年限和日期差                                                     |
| `EconomicYears`                               | 经济寿命年限（是否触发重置支出的判断依据）                                             |
| `DepreciationPeriod`                          | 折旧年限（会计折旧周期）                                                               |

### 二、永续期分支 1：会到经济寿命 ⇒ 更换新资产

> 触发条件：`TheRemainingUsefulLife > EconomicYears`，即预计在永续期内**会**走到下一次经济寿命到期 ⇒ 会发生旧资产退役 + 新资产更换。

**业务本质**

分支 1 模拟的是"**资产不断被更换**"的循环：

| 财务动作                                           | 模型对应                                                      |
| -------------------------------------------------- | ------------------------------------------------------------- |
| 旧资产报废 → 残值回收                             | 已在预测期的每次"重置支出"中体现（支出 = 原值 × (1-残值率)） |
| 旧资产剩余账面价值 → 折成当前等价永续年度折旧额 | `poolResidualDepreciation * rate` |
| 购入新资产 → 后续每`EconomicYears` 周期重复一次 | `PV × PMT / rate × rate`（重置支出现值年金）              |

> ⚠️ 注意：分支 1 触发条件是"**预计会**更换"，不是"已经更换"。当前实现不是把池子余额整笔直接加到永续期折旧里，而是先按 `poolResidualDepreciation * rate` 折成当前等价永续年度折旧额，再与后续重置周期部分合并。

**处理逻辑**

```mermaid
flowchart LR
    Pool1["支出池剩余<br/>= 旧资产剩余账面价值"]:::pool --> Add1["先乘折现率<br/>折成永续年度额"]
    Reset1["重置支出现值年金<br/>= 未来每次换新资产<br/>PV × PMT / rate × rate"]:::reset --> Add1
    Add1 --> Result1["PerpetualPeriodDepreciation"]:::result

    classDef pool fill:#FFD8B1,stroke:#E67E22
    classDef reset fill:#D6EAF8,stroke:#2874A6
    classDef result fill:#D5F5E3,stroke:#239B56
```

**公式**

```
永续期折旧 = poolResidualDepreciation * rate
           + PV(rate, RemainingUsefulLife - EconomicYears, 0,
                    PMT(rate, EconomicYears, PV(...), 0, 1) / rate, 0) * rate
永续期支出 = PV(rate, RemainingUsefulLife - EconomicYears, 0,
                  PMT(rate, EconomicYears, 原值*(1-残值率), 0, 0), 1)
```

**文字描述**

资产**会**走到经济寿命，意味着它在永续期里会发生重置（升级/重置/更新投资）。此时：

1. **支出池里没折完的钱 → 先折成永续年度额**：当前实现将预测期末剩余可折旧金额按 `poolResidualDepreciation * rate` 折成当前等价永续年度折旧额，而不是把余额整笔直接加到永续期折旧中。
2. **未来的重置支出现值**：按"每个经济寿命周期重置一次"年金化到永续期，这部分与历史池子无关，是永续期持续运营的资本性支出回报。

### 三、永续期分支 2：不会到经济寿命（不会触发重置支出）

> 触发条件：`TheRemainingUsefulLife <= EconomicYears`，即资产到永续期初时寿命不足以触发新一轮经济寿命到期（绝大多数折旧表场景，特别是**经济寿命 1000 年**这种"无限寿命"资产）。

**处理逻辑**

```mermaid
flowchart LR
    Pool2["支出池剩余<br/>poolResidualDepreciation"]:::pool --> Add2["先按剩余折旧期拆成<br/>有限期年折旧流"]
    Remain2["余额拆流折现额<br/>PV(rate, RemainingDepreciableYears, poolResidualDepreciation / RemainingDepreciableYears, 0, 0) * rate"]:::remain --> Add2
    Perp2["下一周期永续年金额<br/>PV(rate, RemainingUsefulLife, 0, PMT(...)/rate, 0) * rate"]:::perp --> Add2
    Add2 --> Result2["PerpetualPeriodDepreciation"]:::result

    classDef pool fill:#FFD8B1,stroke:#E67E22
    classDef remain fill:#D6EAF8,stroke:#2874A6
    classDef perp fill:#FADBD8,stroke:#C0392B
    classDef result fill:#D5F5E3,stroke:#239B56
```

**公式**

```
永续期折旧 = PV(rate, RemainingDepreciableYears,
                poolResidualDepreciation / RemainingDepreciableYears, 0, 0) * rate
           + PV(rate, RemainingUsefulLife, 0, PMT(rate, EconomicYears, PV(...), 0, 1)/rate, 0) * rate

永续期支出 = PV(rate, RemainingUsefulLife, 0,
                  PMT(rate, EconomicYears, 原值*(1-残值率), 0, 0), 1)
```

**文字描述**

资产**不会**走到经济寿命，意味着进入永续期后**不再发生重置支出**（不会更新换代），但账上仍然有未折完的钱需要处理：

1. **支出池里没折完的钱 → 先按剩余折旧期拆流**：这里不会把池子余额整笔并入永续期折旧，而是先用 `poolResidualDepreciation / TheRemainingDepreciableYears` 还原为有限期等额年折旧流，再折成当前等价永续年度折旧额。
2. **剩余折旧年限内的年金部分**：折现基数不是固定的 `MonthlyDepreciation * 12`，而是由预测期末剩余池子余额反推得到的等额年折旧流。
3. **永续年金部分**：每 `EconomicYears` 一个完整周期年金化到永续期。
4. **永续期支出**：仍按公式给出（即使不重置，模型仍保留资本循环口径的现值）。

### 四、这种处理方式是否符合企业会计常规？

#### 1. 预测期 / 显性预测期 + 永续期（终值）的两阶段模型

这是 DCF 估值（**Discounted Cash Flow**，现金流折现模型）的标准做法：

> 根据 IFRS / CAS（企业会计准则第 8 号——资产减值）以及评估行业实务，对固定资产组、CGU（现金产生单元）的价值测试采用"明确预测期 + 永续期终值"是被广泛接受的方法。✅ 完全符合。

#### 2. 折旧现值化（把永续期折旧折现）

把预测期后的折旧按永续年金（Gordon Growth / 资本化）折现到永续期初——这在**资产评估实务**（机器设备评估、固定资产组评估）中是常见做法。✅ 符合。

#### 3. "支出池剩余折成永续年度额"（分支 1）

会计上对应两种解释：

- **评估口径下的年度额折算**：如果管理层判断资产永续期会进入重置周期，当前实现会先把剩余可折旧余额按折现率折成一个等价年度额，再与后续周期现金流口径统一。
- **不是会计上的整笔清账分录**：它更接近估值模型中的口径转换，而不是直接把剩余账面价值整笔确认为当期损失。

> ⚠️ 需要在**评估报告**或**会计政策说明**中明确披露这种处理逻辑，否则容易把评估口径误读成会计分录口径。更严谨的做法是单独说明该年度额来自 `poolResidualDepreciation * rate` 的口径转换。

#### 4. "支出池剩余按剩余折旧期拆流再折现"（分支 2）

数学上：这里先把 `poolResidualDepreciation` 按 `TheRemainingDepreciableYears` 还原为有限期等额年折旧流，再用 `PV(...)*rate` 折成当前等价永续年度折旧额，并不是直接令 `C / rate = 池子剩余`。这在**价值评估**上更接近“剩余余额有限期摊销”的口径，但在**会计**上仍需注意：

- **会计准则通常不允许资产在剩余使用寿命结束后还继续按账面价值挂账折旧**（CAS 4 号——固定资产明确要求"已达到预定可使用状态但未办理竣工决算"或"已提足折旧仍继续使用"的资产**停止折旧**）。
- 因此"把池子剩余作为永续年金继续折"严格讲**不完全符合会计准则**，更偏向**价值评估口径**（评估资产对现金流的永续贡献）。

> ⚠️ 建议：这是**评估模型**而非**会计账务**，应在底稿中说明"永续期口径为评估价值口径，非会计折旧口径"。

### 五、建议与注意事项

1. **在底稿/报告中披露口径**：明确"本表为**评估价值口径**"，区分会计折旧与评估折旧。
2. **分支选择依据**：在数据源中明确标注"是否预测期内会重置投资"（`whetherTheInvestmentIsUpdatedDuringTheForecastPeriod` 字段），并据此回到合适分支。
3. **经济寿命极端值**：建议对 `经济寿命年限 >= 100` 的资产单独复核，避免数值精度问题。
4. **披露会计政策影响**：分支 2 的"剩余余额拆流折现"在会计上需要管理层判断，建议在 Excel 底稿的备注中注明理由。

### 六、流程总览（一张图看懂）

```mermaid
flowchart TD
    subgraph Forecast["预测期（显性预测期）"]
        direction TB
        F1["每月份：折旧 = Min(MonthlyDepreciation, 池子)<br/>池子扣减 → 累计入折旧表"]
        F2["若命中重置支出点：<br/>支出 = 原值*(1-残值率) → 池子增加"]
        F1 --> F2 --> F1
    end

    subgraph Terminal["永续期（终值）"]
        direction TB
        T1{"剩余使用年限 > 经济寿命?"}
        T2["分支A：会重置<br/>池子剩余 × 折现率"]
        T3["分支B：不会重置<br/>池子剩余按剩余折旧期拆流折现"]
        T4["加上：重置支出现值年金<br/>(各经济寿命周期一次)"]
        T5["加上：下一周期永续年金<br/>(每经济寿命周期一次)"]

        T1 -->|"是"| T2 --> T4
        T1 -->|"否"| T3 --> T5
    end

    Forecast --> Terminal
```
