技术博客

净值计算的四则运算与精度陷阱

第 83 / 141 篇 · 2025-06-15 · secfin · 估值核算净值计算精度舍入

估值核算里最没有技术含量的公式是单位净值:

$$ \text{单位净值} = \frac{\text{资产净值}}{\text{份额总数}}, \qquad \text{资产净值} = \sum_i (\text{数量}_i \times \text{单价}_i) - \sum_j \text{负债}_j $$

只有乘法和减法。但工程上净值计算是被精度问题折磨最深的模块——不是算不出来,是不同系统算出来的数对不上。这篇把三个真实的坑讲清楚。

坑一:先舍入还是先汇总

每个科目的市值算出来是无限小数(数量 × 单价,单价本身精确到厘),系统必须决定舍入发生在哪一步:

  • 方案 A:每个科目先四舍五入到分,再汇总出资产净值。
  • 方案 B:全部科目用全精度汇总,最后资产净值舍入到分。

两种方案在数学上差最多 n/2 分钱(n 是科目数)。对产品自身没影响——但估值系统和托管系统如果用了不同方案,每天对账差 1 分钱,财务会天天找你。行业惯例是 方案 A:科目级先舍入,理由是科目金额是会计事实,要能直接和凭证、报表对上;总账汇总值是科目金额的算术结果,不能再引入第二套舍入。所以规则是:每个金额字段的精度在落库时确定,之后全部是整数分运算,不再有浮点。

实现上金额一律用整数分存储(BIGINT,单位 0.01 元),禁止用 double/float 存金额。这不是洁癖——二进制浮点连 0.1 都存不精确,0.1 + 0.2 = 0.30000000000000004,在分位舍入前做任何中间运算都会引入不可预期的偏差。

坑二:0.0001 元是实钱

单位净值披露到四位小数。听起来最后一位是零头,放大到份额上就不是了:

$$ 1 \text{ 亿份} \times 0.0001 \text{ 元} = 1 \text{ 万元} $$

规模百亿的公募,单位净值最后一位就是十万元级别。所以净值计算的每一步舍入都要想清楚"偏的方向是谁受益"。

更隐蔽的是舍入方向不对称:申购确认按"金额 ÷ 单位净值"折算份额,赎回按"份额 × 单位净值"算金额。假设单位净值 1.2345 元,客户申购 10 万元:份额 = 100000 / 1.2345 = 81004.4552...,确认份额要舍入(实务保留到 0.01 份)→ 81004.46 份,客户"多拿了"0.005 份。另一边赎回 81004.46 份:金额 = 81004.46 × 1.2345 = 100000.0058 → 100000.01 元。两个方向各舍入一次,产品资产和客户权益之间就产生系统性的分位漂移。应对办法是规则全局统一并写进估值制度:舍入模式(四舍五入/银行家舍入)、保留位数、尾差归属,三个系统(管理人、托管、TA)用同一份制度,漂移量被控制在可解释范围内。

坑三:尾差挂在哪

资产净值减去负债后,理论上等于各科目余额加总。但凭证是逐笔生成的,每笔舍入,加总起来和直接算的可能差一两分:

$$ \text{尾差} = \text{资产净值} - \sum \text{科目余额} - \sum \text{负债余额} $$

这个尾差不"摊销"、不"调整"——规则是挂进未分配利润(损益平准金)科目,让恒等式严格成立。原因很朴素:强摊销会让尾差混进某个具体科目,掩盖真实错误;挂未分配利润则尾差独立可见,勾稽校验直接盯着它,异常放大立刻报警。实务上尾差每天应该在 ±0.05 元以内,某天平白多出 3 块钱,八成是某笔凭证金额方向写反了。

一个完整算例

某产品持有 A 股票 100 万股,收盘价 12.345 元;B 债券 2 万张,估值净价 101.2345 元/张;银行存款 500 万元;当日计提管理费 3424.66 元(前日资产净值 8000 万 × 1.5% / 350 天)。

  • A 股票市值:1000000 × 12.345 = 1234.50 万元
  • B 债券市值:20000 × 101.2345 = 202.469 万元 → 科目级舍入 2024690.00 元
  • 资产总值 = 12345000 + 2024690 + 5000000 = 19369690.00 元
  • 资产净值 = 19369690.00 − 3424.66 = 19366265.34 元
  • 份额 15000 万份 → 单位净值 = 19366265.34 / 150000000 = 1.291084... → 1.2911 元

每个数字都能追:单价来自行情快照(带时间戳),费率来自计提模板版本,舍入规则全局唯一。净值计算做到这个程度,对账差钱时排查才有抓手——这是"四则运算"背后真正的工作量。

净值计算的数据流与精度链 持仓数量(股/张) 整数,清算对账后确定 证券单价(元) 收盘价/第三方估值净价 负债与费用(元) 费用按日计提,分位 科目市值 = 数量 × 单价,逐科目四舍五入到分 全部金额整数分运算,不落浮点 资产净值 ÷ 份额总数 = 单位净值(保留四位小数) 尾差挂未分配利润,强摊销会掩盖真实错误 0.0001 元 × 1 亿份 = 1 万元:净值末位是实钱,舍入方向与位数全局统一