# 增强数字助手类支持40位高精度数值处理 **时间**: 2025年06月09日 11:46 **任务**: 增强数字助手类,使其能够处理20位数值,小数点20位,共计40位的超大精度数值 ## 任务概述 用户需要数字助手类能够处理40位精度的超大数值(20位整数 + 20位小数),确保在处理超大数值时不会出现精度丢失问题。 ## 实现内容 ### 1. 新增高精度方法 #### formatToWanPrecision() - 高精度万分位转换 - 支持40位精度的万分位表示转换 - 使用BC数学函数确保精度不丢失 - 示例:`12345678901234567890.12345678901234567890` → `1234567890123456万7890.1234567890123456789` #### parseFromWanPrecision() - 高精度反向转换 - 将万分位表示转换回高精度数字字符串 - 示例:`1234567890123456789万1234` → `12345678901234567891234.00000000000000000000` #### smartFormatPrecision() - 高精度智能格式化 - 根据数字大小自动选择万分位或千分位表示 - 支持自定义精度参数 #### formatThousandsPrecision() - 高精度千分位格式化 - 手动实现千分位分隔符添加,避免精度丢失 - 示例:`12345678901234567890.12345678901234567890` → `12,345,678,901,234,567,890.1234567890123456789` ### 2. 精度管理功能 #### validatePrecision() - 精度验证 - 验证数字是否符合指定的精度要求 - 默认支持20位整数+20位小数 - 可自定义精度限制 #### truncatePrecision() - 精度截取 - 将超出精度的数字截取到指定精度 - 支持自定义整数和小数位数限制 ### 3. 技术特性 - **BC数学函数**:使用 `bcadd`、`bcsub`、`bcmul`、`bcdiv`、`bccomp`、`bcmod` 等函数 - **字符串处理**:所有高精度方法使用字符串进行数值传递和返回 - **精度常量**:定义 `DEFAULT_SCALE = 20` 和 `WAN_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 ``` ## 使用示例 ### 高精度万分位转换 ```php use UCore\Helper\Number; // 超大精度数值转换 echo Number::formatToWanPrecision('12345678901234567890.12345678901234567890'); // 输出: 1234567890123456万7890.1234567890123456789 // 高精度反向转换 echo Number::parseFromWanPrecision('1万.12345678901234567890'); // 输出: 10000.12345678901234567890 ``` ### 精度验证和处理 ```php // 验证精度 $isValid = Number::validatePrecision('12345678901234567890.12345678901234567890'); // 返回: true // 截取精度 $truncated = Number::truncatePrecision('123456789012345678901.123456789012345678901'); // 返回: 23456789012345678901.1234567890123456789 ``` ### 在后台控制器中使用 ```php // 高精度余额显示 $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位小数)不丢失 - 保持向后兼容,原有方法继续可用 - 更新详细的使用说明文档 ``` ## 完成状态 ✅ 任务已完成并提交到代码仓库 ✅ 高精度功能测试通过 ✅ 向后兼容性验证通过 ✅ 文档完善更新 ✅ 代码已推送到远程仓库