fix(swap): 统一处理【名义本金】数值精度舍入问题

- 在多个位置添加 Math.Round 函数确保金额计算精度
- 新增 NormalizeNotionalValues 方法统一处理 UnwindData 中的名义本金舍入
- 修复交易平仓时 StockEqvNotional 扣减计算的精度问题
- 解决持仓数据 PosiNotionalValue 的精度舍入处理
- 修复前端页面显示格式化问题
- 添加单元测试验证名义本金舍入逻辑正确性
This commit is contained in:
张名锐
2026-07-22 13:05:49 +08:00
parent e7c6e432e1
commit 0755233ab6
7 changed files with 53 additions and 21 deletions
@@ -237,5 +237,26 @@ namespace YLErp.Modules.SwapModule
Assert.AreEqual("确认成交", td.TradeStatus, "部分平仓 TradeStatus 保持不变");
Console.WriteLine($"UW_008: A=0.3→B={service.SaveSwapDealCalls[0].data.ClosePercent}, HasPartialUnWind={td.HasPartialUnWind} ✅");
}
[TestMethod]
public void UW_009_SwapUnwind_名义本金写入前舍入两位小数()
{
var td = SwapDealTestFactory.CreateTrade();
td.StockEqvNotional = 1000000.006;
var service = new TestableSwapDealService(td);
var unwindData = SwapDealTestFactory.CreateUnwindData(
swapRealizedPnL: 0m, closeMethod: (int)CloseMethodEnum., closePercent: 0.5m,
closeQty: 5000m, closeNotionalValue: 500000.004m, positionQty: 10000m);
unwindData.NotionalValue = 1000000.006m;
unwindData.PosiNotionalValue = 1000000.006m;
service.SwapUnwind(unwindData);
var savedData = service.SaveSwapDealCalls[0].data;
Assert.AreEqual(1000000.01m, savedData.NotionalValue, "期初名义本金应按两位小数写入事件");
Assert.AreEqual(1000000.01m, savedData.PosiNotionalValue, "剩余名义本金应按两位小数写入事件");
Assert.AreEqual(500000.00m, savedData.CloseNotionalValue, "平仓名义本金应按两位小数写入事件");
Assert.AreEqual(500000.01, td.StockEqvNotional, 0.000001, "trade 剩余名义本金应在扣减后舍入两位小数");
}
}
}