Skip to content

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.0

RoundCurrency

高精度四舍五入

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.97

GetRandRange

获取指定范围的随机整数

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

最佳实践

  1. 财务计算使用 Currency: 避免 Double 类型的精度问题
  2. 明确舍入模式: 根据业务需求选择合适的舍入模式
  3. 设置随机种子: 使用 Randomize 初始化随机数生成器
  4. 范围检查: 使用随机数前检查范围边界
  5. 格式化显示: 计算后使用 Format 函数进行显示格式化

注意事项

  • RoundCurrency 的小数位数限制在 -4 到 4 之间
  • 超大数值可能导致溢出,Currency 最大支持 922337203685477.5807
  • GetRandRange 需要先调用 Randomize 以获得不同序列
  • 负数的四舍五入向远离零的方向舍入

VB6及其LOGO版权为微软公司所有