Trunchierea dublei cu VBA în Excel (Programare, Excel, Dublu, Punct Zecimal, Vba)

Ehudz a intrebat.

Am nevoie să trunchez cantitatea de zecimale din valoarea mea dublă pentru a fi afișată într-o casetă de text. Cum se poate realiza acest lucru cu vba?

5 răspunsuri
Siddharth Rout

Puteți utiliza fie ROUND pentru FORMAT în VBA

De exemplu, pentru a afișa 2 locuri zecimale

Dval = 1.56789

Debug.Print Round(dVal,2)

Debug.Print Format(dVal,"0.00")

Notă: Cele de mai sus vă vor da 1.57. Deci, dacă căutați 1.56 atunci puteți stoca Dval într-un șir de caractere și apoi să faceți acest lucru

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

Comentarii

  • Nu tratați niciodată numerele ca text. –  > Por Gustav.
Gary McGill

Dacă doriți să rotunjiți valoarea, atunci puteți utiliza funcția Round (dar rețineți că funcția Round din VBA utilizează rotunjirea Banker, cunoscută și sub numele de rotunjire la egalitate, unde va rotunji un 5 în sus sau în jos; pentru a rotunji utilizând rotunjirea tradițională, utilizați Format).

Dacă doriți să trunchiați valoarea fără rotunjire, atunci nu este nevoie să folosiți șiruri de caractere ca în răspunsul acceptat – folosiți doar matematica:

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

Astfel se obține „2,34”.

Comentarii

  • Uitasem de rotunjirea bancherului. +1 în ciuda loviturii condescendente „just use math”. Pentru a afișa doar numărul, așa cum a cerut OP, dacă nu vă pasă prea mult de rotunjire, Format() este instrumentul potrivit și este mai simplu decât Fix() (sau Int(), care este echivalent cu Fix() pentru numere pozitive). Cu toate acestea, există cazuri în care rotunjirea lui Banker va cauza întrebări utilizatorilor și va necesita o transformare mai complexă. –  > Por GlennFromIowa.
Makah

Puteți utiliza funcția Int(). Debug.print Int(1.99543)

Sau mai bine:

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

Deci, puteți utiliza Trunc(1.99543, 4) ==> result: 1.9954

Zac

Aceasta a fost încercarea mea:

Function TruncateNumber(decimalNum As Double, decPlaces As Integer) As Double
'decimalNum: the input number to be truncated
'decPlaces: how many decimal places to round to. Use 0 for no decimal places.
    decimalLocation = InStr(decimalNum, ".")
    TruncateNumber = Left(decimalNum, decimalLocation + decPlaces)
End Function

Folosește șiruri de caractere pentru a evita orice erori matematice cauzate de diferite metode de rotunjire. Va ieși ca un tip double, astfel încât să puteți efectua în continuare propriile calcule matematice pe el.

Aceasta va cauza o eroare dacă un număr fără o zecimală este trecut în funcția de mai sus. Dacă acest lucru vă îngrijorează, puteți utiliza în schimb următorul cod:

Function TruncateNumber(decimalNum As Double, decPlaces As Integer) As Double
'decimalNum: the input number to be truncated
'decPlaces: how many decimal places to round to. Use 0 for no decimal places.
    If InStr(decimalNum, ".") = 0 Then 'if there was no decimal:
        'then return the number that was given
        TruncateNumber = decimalNum
    Else 'if there is a decimal:
        'then return the truncated value as a type double
        decimalLocation = InStr(decimalNum, ".")
        TruncateNumber = Left(decimalNum, decimalLocation + decPlaces)
    End If
End Function

Sperăm că aceste funcții sunt de folos cuiva. Nu am făcut teste extinse, dar pentru mine au funcționat.

justengel

Deci, poveste amuzantă. M-am jucat cu o funcție rapidă de conversie VB. Vreau doar să trunchez un dublu într-un întreg.

value = Int(83.768)
value == 83

Minunat, ceva în VB chiar a funcționat.

Oops, am uitat că nu funcționează cu numere negative

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

… da, asta tocmai s-a întâmplat. VB folosește rotunjirea Banker.

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

Dacă vrei zecimale specifice, fă ceea ce a făcut Makah, dar cu Abs în jurul valorii, astfel încât Int să poată trunchia corect.

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

Comentarii

  • Există o funcție de semn care realizează sign = Abs(value) / value într-un singur pas: Sgn(value). –  > Por vpprof.