Kontakt
DSVGO
Historie | |
---|---|
05.04.2008 | Unterschied "kaufmännisch" zu "mathematisch" verdeutlicht |
30.04.2000 | Erste Version |
Die folgende Funktion rundet eine Zahl auf eine bestimmte Stellenanzahl (Default: 0). Bei negativer Stellenanzahl wird der entsprechende Betrag vor dem Komma gerundet.
Im Gegensatz zu der in VB6 eingebauten Funktion wird hier "kaufmännisch" (also "wie in der Schule gelernt") gerundet: ab einer 5 wird immer aufgerundet. Bei der VB6-Rundung ("unverzerrt" bzw. "mathematisch") wird dagegen immer zur nächsten geraden Zahl gerundet, d.h. sowohl Round(1.5) als auch Round(2.5) geben in VB6 den Wert 2 als Ergebnis zurück - nicht gerade das, was man normalerweise erwarten würde!
MsgBox Round(321.135) 'ergibt "321" MsgBox Round(321.135, 2) 'ergibt "321,14" MsgBox Round(321.145, 2) 'ergibt "321,15" MsgBox Round(321.135, -2) 'ergibt "300"
Die folgende Funktion benutzt die statische Tabelle Pot10 (wird beim ersten Aufruf gefüllt), um den aufwändigen Aufruf der Potenz-Funktion zu minimieren. Durch interne Nutzung des Decimal-Subtyps werden unschöne Rundungsfehler vermieden, die beim "ungenaueren" Double-Datentyp auftreten würden:
Public Static Function Round( _ ByVal Value As Variant, _ Optional ByVal Digits As Integer = 0 _ ) As Variant Dim i As Long Dim Pot10(-28 To 28) As Variant 'Ggf. 10er-Potenzen vor-berechnen: If i = 0 Then For i = LBound(Pot10) To UBound(Pot10) Pot10(i) = CDec(10 ^ i) Next i End If 'Los gehts: On Error Resume Next If Value > 0 Then Round = Int(Value * Pot10(Digits) + 0.5) * Pot10(-Digits) Else Round = -Int(-Value * Pot10(Digits) + 0.5) * Pot10(-Digits) End If If Err.Number Then Round = Value On Error GoTo 0 End Function
© Jost Schwider, 30.04.2000-05.04.2008 - http://vb-tec.de/runden.htm