VBMAN.ToolsMath - 数学运算工具对象
概述
VBMAN.ToolsMath 提供了常用的数学运算功能,包括高精度四舍五入、取整、随机数生成等,特别适用于财务计算和精确数值处理。
核心特性
- 高精度计算: 使用 Currency 类型,支持4位小数精度
- 多种舍入模式: 四舍五入、向上取整、向下取整
- 大数支持: 可处理大范围内的数值运算
- 类型安全: 强类型参数,避免隐式转换错误
枚举
EnumRoundingMode
舍入模式枚举
vb
Public Enum EnumRoundingMode
Rounding = 0 ' 传统四舍五入
Upper = 1 ' 向上取整
Downer = 2 ' 向下取整
End Enum方法
Ceil
截断取整(向正无穷方向)
vb
Public Function Ceil(ByVal Num As Variant, Optional ByVal Dot As Long) As Currency参数:
Num- 要取整的数值Dot- 小数位精度(默认0,即整数)
示例:
vb
' 基本取整
Dim r1 As Currency
r1 = VBMAN.ToolsMath.Ceil(3.7) ' 结果: 4
Dim r2 As Currency
r2 = VBMAN.ToolsMath.Ceil(-3.7) ' 结果: -3
' 保留2位小数
Dim r3 As Currency
r3 = VBMAN.ToolsMath.Ceil(3.14159, 2) ' 结果: 3.15
' 保留1位小数
Dim r4 As Currency
r4 = VBMAN.ToolsMath.Ceil(10.99, 1) ' 结果: 11.0RoundCurrency
高精度四舍五入
vb
Public Function RoundCurrency(ByVal Value As Variant, Optional ByVal DecimalPlaces As Integer = 0, Optional ByVal RoundingMode As EnumRoundingMode = 0) As Currency参数:
Value- 要舍入的数值DecimalPlaces- 小数位数(-4 到 4,默认0)RoundingMode- 舍入模式(默认传统四舍五入)
示例:
vb
' 基本四舍五入
Dim r1 As Currency
r1 = VBMAN.ToolsMath.RoundCurrency(3.5) ' 结果: 4
Dim r2 As Currency
r2 = VBMAN.ToolsMath.RoundCurrency(3.4) ' 结果: 3
' 保留小数位
Dim r3 As Currency
r3 = VBMAN.ToolsMath.RoundCurrency(3.14159, 2) ' 结果: 3.14
Dim r4 As Currency
r4 = VBMAN.ToolsMath.RoundCurrency(3.14159, 3) ' 结果: 3.142
' 负数处理
Dim r5 As Currency
r5 = VBMAN.ToolsMath.RoundCurrency(-3.5) ' 结果: -4(远离零)
' 不同舍入模式
Dim r6 As Currency
r6 = VBMAN.ToolsMath.RoundCurrency(3.1, 0, Upper) ' 结果: 4(向上取整)
Dim r7 As Currency
r7 = VBMAN.ToolsMath.RoundCurrency(3.9, 0, Downer) ' 结果: 3(向下取整)
' 财务计算(保留2位小数)
Dim price As Currency
Dim quantity As Integer
Dim total As Currency
price = 19.99
quantity = 3
total = VBMAN.ToolsMath.RoundCurrency(price * quantity, 2)
' 结果: 59.97GetRandRange
获取指定范围的随机整数
vb
Public Function GetRandRange(a As Long, b As Long) As Long参数:
a- 范围起始值(包含)b- 范围结束值(包含)
返回: [a, b] 范围内的随机整数
示例:
vb
' 掷骰子 (1-6)
Dim dice As Long
dice = VBMAN.ToolsMath.GetRandRange(1, 6)
Debug.Print "骰子点数: " & dice
' 随机验证码 (1000-9999)
Dim code As Long
code = VBMAN.ToolsMath.GetRandRange(1000, 9999)
Debug.Print "验证码: " & code
' 数组随机索引
Dim arr(1 To 10) As String
Dim randomIndex As Long
randomIndex = VBMAN.ToolsMath.GetRandRange(LBound(arr), UBound(arr))
Debug.Print "随机选中: " & arr(randomIndex)
' 随机颜色
Dim r As Long, g As Long, b As Long
r = VBMAN.ToolsMath.GetRandRange(0, 255)
g = VBMAN.ToolsMath.GetRandRange(0, 255)
b = VBMAN.ToolsMath.GetRandRange(0, 255)
Me.BackColor = RGB(r, g, b)综合示例
示例1: 财务金额计算
vb
Private Sub CalculateInvoice()
Dim items(1 To 3, 1 To 3) As Currency
' 商品: 单价, 数量, 折扣
items(1, 1) = 199.99: items(1, 2) = 2: items(1, 3) = 0.95 ' 95折
items(2, 1) = 59.5: items(2, 2) = 5: items(2, 3) = 1 ' 无折扣
items(3, 1) = 299: items(3, 2) = 1: items(3, 3) = 0.8 ' 8折
Dim subtotal As Currency
Dim i As Integer
For i = 1 To 3
Dim itemTotal As Currency
itemTotal = items(i, 1) * items(i, 2) * items(i, 3)
' 每个商品金额保留2位小数
itemTotal = VBMAN.ToolsMath.RoundCurrency(itemTotal, 2)
subtotal = subtotal + itemTotal
Debug.Print "商品" & i & ": " & itemTotal
Next i
Dim tax As Currency
tax = VBMAN.ToolsMath.RoundCurrency(subtotal * 0.13, 2) ' 13%税
Dim total As Currency
total = VBMAN.ToolsMath.RoundCurrency(subtotal + tax, 2)
Debug.Print "小计: " & subtotal
Debug.Print "税额: " & tax
Debug.Print "总计: " & total
End Sub示例2: 价格显示格式化
vb
Private Function FormatPrice(price As Currency, decimals As Integer) As String
Dim rounded As Currency
rounded = VBMAN.ToolsMath.RoundCurrency(price, decimals)
FormatPrice = Format(rounded, "0." & String(decimals, "0"))
End Function
Private Sub TestFormatting()
Debug.Print FormatPrice(19.999, 2) ' 20.00
Debug.Print FormatPrice(19.994, 2) ' 19.99
Debug.Print FormatPrice(19.995, 2) ' 20.00
End Sub示例3: 抽奖系统
vb
Private Sub LotteryDraw()
' 奖品池
Dim prizes As Variant
prizes = Array("一等奖: iPhone", "二等奖: iPad", "三等奖: 耳机", "谢谢参与")
' 中奖概率(累计)
Dim probabilities As Variant
probabilities = Array(5, 15, 40, 100) ' 5%, 10%, 25%, 60%
' 随机数 1-100
Dim rand As Long
rand = VBMAN.ToolsMath.GetRandRange(1, 100)
Dim result As String
Dim i As Integer
For i = 0 To UBound(probabilities)
If rand <= probabilities(i) Then
result = prizes(i)
Exit For
End If
Next i
MsgBox "随机数: " & rand & vbCrLf & "结果: " & result
End Sub示例4: 分页计算
vb
Private Function CalculatePagination(totalRecords As Long, pageSize As Long, currentPage As Long) As Scripting.Dictionary
Dim result As New Scripting.Dictionary
' 计算总页数(向上取整)
Dim totalPages As Long
totalPages = VBMAN.ToolsMath.Ceil(totalRecords / pageSize)
' 确保当前页有效
If currentPage < 1 Then currentPage = 1
If currentPage > totalPages Then currentPage = totalPages
' 计算起始和结束记录
Dim startRecord As Long
Dim endRecord As Long
startRecord = (currentPage - 1) * pageSize + 1
endRecord = currentPage * pageSize
If endRecord > totalRecords Then endRecord = totalRecords
result("TotalRecords") = totalRecords
result("TotalPages") = totalPages
result("CurrentPage") = currentPage
result("PageSize") = pageSize
result("StartRecord") = startRecord
result("EndRecord") = endRecord
Set CalculatePagination = result
End Function最佳实践
- 财务计算使用 Currency: 避免 Double 类型的精度问题
- 明确舍入模式: 根据业务需求选择合适的舍入模式
- 设置随机种子: 使用
Randomize初始化随机数生成器 - 范围检查: 使用随机数前检查范围边界
- 格式化显示: 计算后使用
Format函数进行显示格式化
注意事项
RoundCurrency的小数位数限制在 -4 到 4 之间- 超大数值可能导致溢出,Currency 最大支持 922337203685477.5807
GetRandRange需要先调用Randomize以获得不同序列- 负数的四舍五入向远离零的方向舍入