VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / Allgemein / Mathe / Runden Runden grosser Zahlen (wie in der Schule gelernt) |
| 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