|
|
@@ -0,0 +1,151 @@
|
|
|
+# 增强数字助手类支持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位小数)不丢失
|
|
|
+- 保持向后兼容,原有方法继续可用
|
|
|
+- 更新详细的使用说明文档
|
|
|
+```
|
|
|
+
|
|
|
+## 完成状态
|
|
|
+
|
|
|
+✅ 任务已完成并提交到代码仓库
|
|
|
+✅ 高精度功能测试通过
|
|
|
+✅ 向后兼容性验证通过
|
|
|
+✅ 文档完善更新
|
|
|
+✅ 代码已推送到远程仓库
|