Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / Runden

Runden grosser Zahlen (wie in der Schule gelernt)

Historie
05.04.2008Unterschied "kaufmännisch" zu "mathematisch" verdeutlicht
30.04.2000Erste Version

Einleitung

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!

Beispiele

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"

Code / Quelltext

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