Truncating Double with VBA in excel

前端 未结 4 1216
刺人心
刺人心 2021-01-04 05:21

I need to truncate the amount of decimal places of my double value for display in a textbox. How would one achieve this with vba?

相关标签:
4条回答
  • 2021-01-04 05:34

    If you want to round the value, then you can use the Round function (but be aware that VBA's Round function uses Banker's rounding, also known as round-to-even, where it will round a 5 up or down; to round using traditional rounding, use Format).

    If you want to truncate the value without rounding, then there's no need to use strings as in the accepted answer - just use math:

    Dim lDecimalPlaces As Long: lDecimalPlaces = 2
    Dim dblValue As Double: dblValue = 2.345
    
    Dim lScale = 10 ^ lDecimalPlaces
    Dim dblTruncated As Double: dblTruncated = Fix(dblValue * lScale) / lScale
    

    This yields "2.34".

    0 讨论(0)
  • 2021-01-04 05:36

    You can use Int() function. Debug.print Int(1.99543)

    Or Better:

    Public Function Trunc(ByVal value As Double, ByVal num As Integer) As Double
      Trunc = Int(value * (10 ^ num)) / (10 ^ num)
    End Function
    

    So you can use Trunc(1.99543, 4) ==> result: 1.9954

    0 讨论(0)
  • 2021-01-04 05:50

    You can either use ROUND for FORMAT in VBA

    For example to show 2 decimal places

    Dval = 1.56789
    
    Debug.Print Round(dVal,2)
    
    Debug.Print Format(dVal,"0.00")
    

    Note: The above will give you 1.57. So if you are looking for 1.56 then you can store the Dval in a string and then do this

    Dim strVal As String
    
    dVal = 1.56789
    strVal = dVal
    
    If InStr(1, strVal, ".") Then
        Debug.Print Split(strVal, ".")(0) & "." & Left(Split(strVal, ".")(1), 2)
    Else
        Debug.Print dVal
    End If
    
    0 讨论(0)
  • 2021-01-04 05:51

    So fun story. I was messing around with a quick VB conversion function. I just want to truncate a double into an integer.

    value = Int(83.768)
    value == 83
    

    Awesome, something in VB actually worked.

    Oops, I forgot it doesn't work with negative numbers

    value = Int(-83.768)
    value == -84
    

    ... yeah that just happened. VB uses Banker rounding.

    Public Function Trunc(ByVal value As Double) As Integer
      ' Truncate by calling Int on the Absolute value then multiply by the sign of the value.
      ' Int cannot truncate doubles that are negative
      Trunc = (Abs(value) / value) * Int(Abs(value))
    End Function
    

    If you want specific decimal places do what Makah did only with Abs around the value so Int can truncate properly.

    Public Function Trunc2(ByVal value As Double, Optional ByVal num As Integer = 1) As Double
        ' Truncate by calling Int on the Absolute value then multiply by the sign of the value.
        ' Int cannot truncate doubles that are negative
        Dim sign As Integer
        sign = Abs(value) / value
        Trunc2 = sign * (Int(Abs(value) * (10 ^ num)) / (10 ^ num))
    End Function
    
    0 讨论(0)
提交回复
热议问题