Ho bisogno di troncare la quantità di cifre decimali del mio doppio valore per la visualizzazione in una casella di testo. Come si potrebbe raggiungere questo con VBA?Troncare Double con VBA in excel
risposta
È possibile utilizzare ROUND
per FORMAT
in VBA
Ad esempio per mostrare 2 decimali
Dval = 1.56789
Debug.Print Round(dVal,2)
Debug.Print Format(dVal,"0.00")
Nota: È possibile che vi darà 1.57
. Quindi, se siete alla ricerca di 1.56
allora si può memorizzare il DVAL in una stringa e poi fare questo
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
Se si vuole turno il valore, quindi è possibile utilizzare la funzione Round (ma essere consapevoli del fatto che VBA di La funzione di arrotondamento utilizza l'arrotondamento del banco, noto anche come round-to-even, dove arrotonderà un 5 in su o in giù, per arrotondare usando l'arrotondamento tradizionale, usa Formato).
Se si vuole Tronca il valore senza arrotondamento, allora non c'è bisogno di usare le stringhe come nella risposta accettata - basta usare la 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
Questo produce "2.34".
È possibile utilizzare la funzione Int(). 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
in modo da poter usare Trunc(1.99543, 4)
==>result: 1.9954
storia in modo divertente. Stavo scherzando con una rapida funzione di conversione VB. Voglio solo troncare un doppio in un numero intero.
value = Int(83.768)
value == 83
Impressionante, qualcosa in VB ha funzionato davvero.
Ops, ho dimenticato che non funziona con i numeri negativi
value = Int(-83.768)
value == -84
... sì che è capitato. VB utilizza l'arrotondamento dei banchieri.
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
Se volete decimali specifici fanno quello Makah fatto solo con Abs di tutto il valore in modo Int può troncare correttamente.
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
La funzione di correzione è stata molto utile nel mio caso! – carlossierra
Mi ero dimenticato dell'arrotondamento del banchiere. +1 nonostante il condiscendente jab "basta usare la matematica". Per la semplice visualizzazione del numero come OP richiesto, se non ti interessa molto dell'arrotondamento, Format() è lo strumento per il lavoro ed è più semplice di Fix() (o Int(), che è equivalente a Fix() per numeri positivi). Tuttavia, ci sono casi in cui l'arrotondamento del banchiere causerà domande agli utenti e richiederà una trasformazione più complessa. – GlennFromIowa