1
0
forked from erp-dev/erp
Files
erpnew/docs/好布业金额计算报告.md
2026-07-01 11:51:13 +08:00

5.3 KiB
Raw Permalink Blame History

好布业 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 系统在金额计算中,按原始小数完成「数量 × 单价」后,对乘积统一四舍五入(逢五进一)为整数元,输入阶段不舍入,最终结算单位为元级整数金额。