091146-增强数字助手类支持40位高精度.md 5.3 KB

增强数字助手类支持40位高精度数值处理

时间: 2025年06月09日 11:46
任务: 增强数字助手类,使其能够处理20位数值,小数点20位,共计40位的超大精度数值

任务概述

用户需要数字助手类能够处理40位精度的超大数值(20位整数 + 20位小数),确保在处理超大数值时不会出现精度丢失问题。

实现内容

1. 新增高精度方法

formatToWanPrecision() - 高精度万分位转换

  • 支持40位精度的万分位表示转换
  • 使用BC数学函数确保精度不丢失
  • 示例:12345678901234567890.123456789012345678901234567890123456万7890.1234567890123456789

parseFromWanPrecision() - 高精度反向转换

  • 将万分位表示转换回高精度数字字符串
  • 示例:1234567890123456789万123412345678901234567891234.00000000000000000000

smartFormatPrecision() - 高精度智能格式化

  • 根据数字大小自动选择万分位或千分位表示
  • 支持自定义精度参数

formatThousandsPrecision() - 高精度千分位格式化

  • 手动实现千分位分隔符添加,避免精度丢失
  • 示例:12345678901234567890.1234567890123456789012,345,678,901,234,567,890.1234567890123456789

2. 精度管理功能

validatePrecision() - 精度验证

  • 验证数字是否符合指定的精度要求
  • 默认支持20位整数+20位小数
  • 可自定义精度限制

truncatePrecision() - 精度截取

  • 将超出精度的数字截取到指定精度
  • 支持自定义整数和小数位数限制

3. 技术特性

  • BC数学函数:使用 bcaddbcsubbcmulbcdivbccompbcmod 等函数
  • 字符串处理:所有高精度方法使用字符串进行数值传递和返回
  • 精度常量:定义 DEFAULT_SCALE = 20WAN_BASE = 10000
  • 向后兼容:保留原有方法,新增高精度版本

4. 测试验证

通过全面测试验证了以下功能:

高精度万分位转换测试:
12345678901234567890                               -> 1234567890123456万7890
12345678901234567890.12345678901234567890          -> 1234567890123456万7890.1234567890123456789
123456789012345678901234.56789012345678901234      -> 12345678901234567890万1234.56789012345678901234
-98765432109876543210.98765432109876543210         -> -9876543210987654万3210.9876543210987654321

高精度千分位格式化测试:
12345678901234567890                               -> 12,345,678,901,234,567,890
12345678901234567890.12345678901234567890          -> 12,345,678,901,234,567,890.1234567890123456789

精度验证测试:
12345678901234567890.12345678901234567890          -> ✓ 有效
123456789012345678901.12345678901234567890         -> ✗ 无效 (21位整数)

兼容性测试:
100020     -> 原方法: 10万20    | 新方法: 10万20

使用示例

高精度万分位转换

use UCore\Helper\Number;

// 超大精度数值转换
echo Number::formatToWanPrecision('12345678901234567890.12345678901234567890');
// 输出: 1234567890123456万7890.1234567890123456789

// 高精度反向转换
echo Number::parseFromWanPrecision('1万.12345678901234567890');
// 输出: 10000.12345678901234567890

精度验证和处理

// 验证精度
$isValid = Number::validatePrecision('12345678901234567890.12345678901234567890');
// 返回: true

// 截取精度
$truncated = Number::truncatePrecision('123456789012345678901.123456789012345678901');
// 返回: 23456789012345678901.1234567890123456789

在后台控制器中使用

// 高精度余额显示
$grid->column('balance', '余额')->display(function ($value) {
    return Number::formatToWanPrecision($value);
});

// 高精度千分位显示
$grid->column('amount', '金额')->display(function ($value) {
    return Number::formatThousandsPrecision($value, 8); // 保留8位小数
});

技术要点

  1. BC数学函数使用:所有数值运算使用BC函数,确保精度不丢失
  2. 字符串数值处理:输入输出都使用字符串格式,避免浮点数精度问题
  3. 手动千分位分隔:实现 addThousandsSeparator() 方法避免 number_format() 的精度丢失
  4. 精度管理:提供验证和截取功能,确保数值在可控范围内
  5. 向后兼容:原有方法保持不变,新增高精度版本

性能建议

  • 超大数值:使用高精度方法(*Precision
  • 普通数值:使用兼容方法,性能更好
  • 批量处理:根据精度需求选择合适的方法
  • 存储建议:超大精度数值建议以字符串形式存储

提交信息

增强数字助手类:支持40位高精度数值处理

- 新增高精度万分位转换方法 formatToWanPrecision()
- 新增高精度反向转换方法 parseFromWanPrecision()  
- 新增高精度智能格式化方法 smartFormatPrecision()
- 新增高精度千分位格式化方法 formatThousandsPrecision()
- 新增精度验证方法 validatePrecision()
- 新增精度截取方法 truncatePrecision()
- 使用BC数学函数确保40位精度(20位整数+20位小数)不丢失
- 保持向后兼容,原有方法继续可用
- 更新详细的使用说明文档

完成状态

✅ 任务已完成并提交到代码仓库
✅ 高精度功能测试通过
✅ 向后兼容性验证通过
✅ 文档完善更新
✅ 代码已推送到远程仓库