# 好布业 ERP 金额计算规则报告

**—— 计价引擎舍入规则逆向分析 ——**

编制日期：2026 年 6 月

---

## 一、结论摘要

经过逐步测试与逻辑反推，好布业 ERP 系统的金额计算规则已被完整还原。核心规则可用一行公式表达：

> **总价 = ROUND ( 数量 × 单价 , 0 )　—— 逢五进一（round-half-up）**

**关键特征：** 输入阶段不舍入，按原始小数相乘；只在生成总价时把乘积四舍五入到整数（元），逢 0.5 进位。

---

## 二、分析背景

在日常使用中发现，系统的总价金额始终为整数，单价或数量中携带的小数似乎在某一环节被处理掉了。为弄清系统究竟在哪一步、按什么规则处理小数，本次分析采用受控输入测试法：固定其他变量，逐组输入特定数值，观察输出总价，从而逆向推断计算引擎的真实行为。

需要回答三个核心问题：

- 舍入规则是什么——四舍五入、截断（向下取整）还是其他？
- 舍入发生在哪一步——输入阶段（先舍单价/数量）还是乘积阶段（先乘后舍）？
- 逢五如何处理——逢五进一还是银行家舍入（逢五取偶）？

---

## 三、测试数据与观察

以下为全部实测数据，按测试目的分组列出。

### 3.1 基础舍入测试

| 数量 | 单价 | 理论乘积 | 实际总价 | 说明 |
|:---:|:---:|:---:|:---:|:---:|
| 1 | 1.4 | 1.4 | **1** | 舍去 |
| 1 | 1.49 | 1.49 | **1** | 舍去 |
| 1 | 1.5 | 1.5 | **2** | 进位 |

**观察：** 1.5 → 2 进位，说明并非截断（若为截断/向下取整，1.5 应得 1）。结合 1.49 → 1，规则锁定为四舍五入。

### 3.2 对称性测试（小数放数量 vs 放单价）

| 数量 | 单价 | 实际总价 | 说明 |
|:---:|:---:|:---:|:---:|
| 1.49 | 1 | **1** | 小数在数量 |
| 1 | 1.49 | **1** | 小数在单价 |
| 1.5 | 1 | **2** | 小数在数量 |
| 1 | 1.5 | **2** | 小数在单价 |

**观察：** 无论小数落在数量还是单价，处理结果一致，舍入对称。但这些组合均有一个因子为 1，乘积等于小数本身，无法区分“先舍输入”与“先乘后舍”。

### 3.3 关键测试：舍入发生在哪一步

使两个因子都不为整数且不为 1，让两种引擎给出不同结果：

| 数量 | 单价 | 先舍输入预期 | 先乘后舍预期 | 实际总价 |
|:---:|:---:|:---:|:---:|:---:|
| 1.5 | 1.5 | 2×2 = 4 | round(2.25) = 2 | **2** |

**结论：** 实际为 2，等于 round(1.5 × 1.5) = round(2.25)。证明系统先按原始小数相乘、再对乘积舍入，输入阶段不舍入。同时否定了“单价/数量在进入计算前即被取整”及“字段为 INT”的早期猜测——内部计算至少保留小数（很可能为 decimal）。

### 3.4 收尾测试：逢五进一 vs 银行家舍入

此前的进位样本（1.5→2、2.25→2）恰好两种规则结果相同，无法区分。选取乘积正好为 2.5 的点（2 为偶数，银行家舍入会归 2）进行判定：

| 数量 | 单价 | 逢五进一预期 | 银行家舍入预期 | 实际总价 |
|:---:|:---:|:---:|:---:|:---:|
| 1 | 2.5 | 3 | 2 | **3** |

**结论：** 实际为 3，确认为逢五进一（round-half-up），排除银行家舍入。

---

## 四、最终规则与计算流程

综合全部测试，系统计价流程如下：

| 环节 | 行为 |
|:---|:---|
| **输入（数量、单价）** | 保留原始小数，不做任何舍入 |
| **乘法** | 用原始小数相乘，得到带小数的乘积 |
| **生成总价** | 对乘积四舍五入到整数；乘积小数部分 ≥ 0.5 进位（逢五进一，非银行家舍入） |
| **存储 / 显示** | 以整数（元）为单位呈现 |

**计算流程示意：**

```
输入(原始小数) → 数量 × 单价(保留小数) → ROUND 到整数(逢五进一) → 整数元存储/显示
```

---

## 五、系统性质判定

- **精度等级：** 对外结算精度为 0 位小数（整数元），但内部计算保留小数参与运算。
- **舍入位置：** 位于乘积阶段（先乘后舍），而非输入阶段。
- **舍入方式：** 四舍五入、逢五进一（round-half-up）。
- **数据本质：** 金额字段对外表现为整数，但计算层非 INT 截断，更接近 decimal 计算后取整。
- **适用定性：** 属于“元级整数结算”的简化型计价系统，不处理角、分、厘等小单位。

---

## 六、使用建议与注意事项

- 单条记录的小数部分会被舍入，多条汇总时可能产生“先汇总再取整”与“逐条取整再相加”的差异，对账时需明确以哪种口径为准。
- 由于逢五进一，金额在临界值（乘积恰为 X.5）会整体偏高，长期累积对总额有轻微上偏影响，财务核算时可留意。
- 若需更高精度（保留角/分），需在系统层调整结算精度，单纯依赖现有规则无法还原小数金额。
- 建议在正式启用前，对“数量与单价均带两位以上小数”的组合再抽样复核，确保乘积舍入行为在更复杂数值下依旧一致。

---

## 附录：规则一句话总结

> 该 ERP 系统在金额计算中，按原始小数完成「数量 × 单价」后，对乘积统一四舍五入（逢五进一）为整数元，输入阶段不舍入，最终结算单位为元级整数金额。
