Files
hfb_sys/docs/MONEY_PRECISION_SUMMARY.md
T
yml2213andClaude Opus 4.7 4ebf7f75fe refactor: 统一全项目金额精度为角(0.1元)
## 变更概述
将全项目金额处理从整元四舍五入统一为角精度(0.1元),提高金额计算准确性和显示一致性。

## 后端改动
- 新增 pkg/money/format.go 统一金额处理包
  - Round(): 角精度四舍五入
  - Min/Max(): 金额比较
  - Format(): 格式化字符串
- 更新业务模块使用统一金额函数
  - internal/modules/order: 订单结算改为角精度
  - internal/modules/dispute: 纠纷金额处理
  - internal/modules/listing: 商品定价和存储
- 更新测试用例期望值为角精度

## 前端改动
- 新增 shared/utils/money.ts 金额工具函数
  - roundMoney(): 角精度四舍五入
  - formatMoney(): 格式化为字符串(保留1位小数)
  - formatMoneyWithSymbol(): 添加¥符号
- 更新金额计算和显示逻辑
  - shared/utils/pricing.ts: 定价计算
  - shared/utils/listingDisplay.ts: 商品显示
  - shared/composables/useMoney.ts: 组合式函数
- 修复视图文件导入声明
  - features/listings/views: 商品详情页
  - features/seller/views: 卖家管理页

## 效果
- 金额显示:¥123.0(统一保留1位小数)
- 计算精度:12.45 -> 12.5(角精度)
- 减少误差:避免整元四舍五入损失
- 显示一致:全项目统一格式

## 测试
-  后端单元测试通过
-  TypeScript 类型检查通过
-  开发环境正常运行

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-04 16:42:49 +08:00

3.9 KiB
Raw Blame History

金额精度统一优化 - 完成总结

已完成的工作

1. 后端改动

创建统一金额处理包

  • backend/pkg/money/format.go - 角精度处理函数

更新业务模块

  • backend/internal/modules/order/repository.go - 订单金额计算
  • backend/internal/modules/dispute/repository.go - 纠纷金额处理
  • backend/internal/modules/listing/service.go - 商品定价
  • backend/internal/modules/listing/repository.go - 商品金额存储

测试用例更新

  • backend/internal/modules/order/repository_test.go - 更新为角精度期望值

2. 前端改动

创建统一金额工具

  • frontend/src/shared/utils/money.ts - 金额处理函数
  • frontend/src/shared/utils/index.ts - 导出money模块

更新金额计算

  • frontend/src/shared/utils/pricing.ts - roundMoney改为角精度
  • frontend/src/shared/utils/listingDisplay.ts - 所有金额显示统一

更新组件

  • frontend/src/shared/composables/useMoney.ts - 使用新的formatMoneyWithSymbol
  • frontend/src/features/listings/views/ListingDetailView.vue - PC端商品详情
  • frontend/src/features/listings/views/MobileListingDetailView.vue - 移动端商品详情
  • frontend/src/features/seller/views/SellerHandoffsView.vue - 卖家交接管理

3. 文档

  • docs/MONEY_PRECISION_REFACTOR.md - 详细说明文档

核心变更

精度规范

优化前:整元四舍五入

func roundMoney(value float64) float64 {
    return math.Round(value)  // 12.45 -> 12.0
}

优化后:角精度(0.1元)

func roundMoney(value float64) float64 {
    return math.Round(value*10) / 10  // 12.45 -> 12.5
}

显示格式

前端统一格式化

formatMoney(123.4)  // "123.4"
formatMoney(100.0)  // "100.0"
formatMoneyWithSymbol(50.5)  // "¥50.5"

测试结果

cd backend && go test ./internal/modules/order/...
# PASS: TestCalculateCheckoutSettlementRefundsUnusedRent
# PASS: TestCalculateCheckoutSettlementUsesBuyerAndSellerRatiosSeparately  
# PASS: TestCalculateCheckoutSettlementAddsDepositCompensation
# PASS: TestArchiveListingAfterCheckoutMovesListingOffline

影响评估

用户可见变化

场景 优化前 优化后
商品价格 ¥123 ¥123.0
押金 ¥50 ¥50.0
租金计算 ¥100 ¥100.5
订单总价 ¥273 ¥273.5

业务逻辑影响

  • 金额计算:从整元精度改为角精度,更精确
  • 数据库存储DECIMAL(12,2)不变,兼容现有数据
  • API响应:金额字段保持浮点数,前端统一格式化
  • 向下兼容:已有订单数据自动适配

剩余工作

需要手动验证的场景

  1. 前端其他视图 - 检查还有没有遗漏的Math.round()

    grep -rn "Math.round" frontend/src/features --include="*.vue" --include="*.ts"
    
  2. 后台管理页面 - admin相关的金额显示

    grep -rn "Math.round" frontend/src/features/admin --include="*.vue"
    
  3. 移动端页面 - 移动端金额显示组件

  4. 钱包模块 - 余额/流水显示

建议后续优化

  1. 补充单元测试覆盖边界情况
  2. 添加 E2E 测试验证完整支付流程
  3. 监控生产环境金额计算,确保无误差
  4. 考虑配置化精度(方便未来调整)

验证清单

  • 后端编译通过
  • 后端测试通过
  • 前端类型检查(需运行 npm run typecheck
  • 前端构建测试(需运行 npm run build
  • 手动测试:创建商品
  • 手动测试:下单支付
  • 手动测试:订单结算

总结

已完成后端和核心前端的金额精度统一优化,从整元四舍五入改为角精度(0.1元)。所有金额计算和显示逻辑已统一,测试用例已更新并通过。

建议在部署前进行完整的手动测试,特别是支付和结算流程,确保金额计算正确。