Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / Runden

Runden grosser Zahlen (wie in der Schule gelernt)

Impressum
Kontakt
DSVGO
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