Prozentrechnung

15/06/2008 - 17:28 von Lothar Geyer | Report spam
Ich habe ein FlexGrid, in dem ich viele Prozentwerte anzeigen muss.
Prinzipiell ja kein Problem. Nur dass das mal für Long-Werte, mal für
Doubles und mal für Currencies erfolgen muss. Ich habe mir dazu eine
Routine geschrieben:

Private Function ProzentString(IstHundert As Variant _
, Abweichend As Variant) As String
Dim tProz As Single
Dim tStr As String

tStr = ""

If IstHundert <> Abweichend Then
If IstHundert > 0 Then
tProz = Abweichend * 100 / IstHundert
ProzentString = Format$(tProz)
End If
End If

ProzentString = tStr

End Function

Worüber ich mir nicht klar bin: was hat die Deklaration der Parameter
als Variant für Auswirkungen? Übergeben will ich die Parameter ja immer
im "echten" Typ.

Hat das evtl. auch Auswirkungen bei der Rundung?

Wie schaut das mit der Performance aus?

Oder sollte ich doch besser drei verschiedene Funktionen verwenden?

Lothar Geyer
 

Lesen sie die antworten

#1 Thorsten Albers
15/06/2008 - 18:34 | Warnen spam
Lothar Geyer schrieb im Beitrag
...
Worüber ich mir nicht klar bin: was hat die Deklaration der Parameter
als Variant für Auswirkungen? Übergeben will ich die Parameter ja immer
im "echten" Typ.
Hat das evtl. auch Auswirkungen bei der Rundung?



Variant ist nur eine Art Container, der andere Datentypen aufnehmen kann.
Damit bedingt er auch >keine eigenen Rechenregeln oder Wertebereiche<
sondern es kommen die Regeln zum Einsatz, die für den in dem Variant
übergebenen Typ gelten.
Genauer gesagt ist ein Variant letztlich nur ein 'User Defined Type', für
den VB die Behandlungsregeln bereits 'eingebaut' hat und automatisch für
Dich anwendet. Der 'User Defined Type', d.h. die Struktur (= VARIANTARG des
Windows API) sieht im Speicher - aus C in VB übertragen - in etwa
folgendermaßen aus:

Public Type Variant
VarType As Integer
Reserved1 As Integer
Reserved2 As Integer
Reserved3 As Integer
abData(0 To 7) As Byte
End Type

'VarType' gibt an, welcher Datentyp in 'abData()' steht (z.B. VT_I2 vbInteger), und 'abData()' enthàlt die Daten bzw. einen Zeiger auf die
Daten.

Eine Besonderheit stellt der 'Datentyp' Decimal da, der nur in einem
Variant enthalten sein kann: Bei ihm enthàlt 'VarType' den Wert VT_DECIMAL
= vbDecimal, und alle restlichen Bytes der Struktur 'Variant' werden für
die Daten verwendet.

Wie schaut das mit der Performance aus?
Oder sollte ich doch besser drei verschiedene Funktionen verwenden?



Natürlich ist die Performance, in gewissem Umfang, geringer, als wenn die
entsprechenden Datentypen direkt verwendet werden. Da jedoch für die
Interpretation des Variant kein zusàtzlicher Speicher alloziert werden muß
(bei entsprechender Umsetzung braucht nicht einmal zusàtzlich in den
Speicher geschrieben zu werden, was eine Performance-Bremse wàre), dürfte
der Unterschied in ertràglichem Rahmen liegen.
Im Prinzip ist hier also gegen die Verwendung der allgemeinen Funktion
gegenüber spezialisierten nichts zu sagen, zumal die wesentliche
Performance-Bremse die Rechenoperation an sich sein dürfte. Wenn Du bei
dieser Funktion bleibst, solltest Du aber zur Sicherheit eine
Typenüberprüfung hinzufügen, die sicherstellt, daß in dem Variant nur
erlaubte Typen übergeben werden, etwa à la:

Select Case VarType(IstHundert)
Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal
' o.k.
Case Else
' Fehler
End Select

-
Thorsten Albers albers(a)uni-freiburg.de
-

Ähnliche fragen