Feedback

VB - Anzahl der Nachkommastellen einer Dezimalzahl bestimmen

Veröffentlicht von am 17.11.2011
(1 Bewertungen)
Dieses Snippet liefert die Anzahl der Nachkommastellen einer Double-Dezimalzahl. Damit keinesfalls durch mathematische Berechnungen Verfälschungen entstehen können, werden zur Auswertung String-Methoden verwendet. Das gültige Dezimal-Trennzeichen, welches von .NET bei der Umwandlung von Double nach String verwendet wird, wird den Culture-Einstellungen entnommen.
    Public Function NachkommastellenAnzahl(ByVal Zahl As Double) As Integer
        Dim zahltext As String
        Dim anzahl As Integer
        Dim dezimaltrennzeichen As String
        '>>> gültiges Dezimaltrennzeichen holen, welches .NET gerade auch bei der Umwandlung von Double nach String in den String einsetzt  (kann auch ein String aus mehreren Zeichen sein)
        dezimaltrennzeichen = My.Application.Culture.NumberFormat.NumberDecimalSeparator.ToString
        '>>> Dezimalzahl in String umwandeln
        zahltext = Convert.ToString(Zahl)
        '>>> Zahlenstring umdrehen, so dass die Nachkommastellen vorne stehen
        zahltext = StrReverse(zahltext)
        '>>> Dezimaltrennzeichen im Zahlenstring suchen, anzahl wird entsprechend durch die Fundstelle im String bestimmt, da die Fundstelle nullbasiert ist
        anzahl = zahltext.IndexOf(dezimaltrennzeichen)
        '>>> Wird das Dezimaltrennzeichen nicht gefunden (Ergebnis: -1), so ist die Anzahl = 0
        If anzahl < 0 Then anzahl = 0
        '>>> RÜCKGABE
        Return anzahl
    End Function

1 Kommentare zum Snippet

Scavanger schrieb am 02.12.2011:
"Anzahl der Nachkommastellen" auch genannt Exponent ist bei der internen Zahlendarstellung von Gleitkommazahlen schon vorhanden. (Details bei Wikipedia: http://de.wikipedia.org/wiki/Gleitkommazahl).
Man muss sie nur sichtbar machen und muss dann keinen Zirkus mit Strings veranstalten wenn man mit Zahlen arbeitet.

Hier mal ein Beispiel, in zwar in C# und mit Decimal (da gibts es schon eine eingebaute Funktion um an Mantisse, Exponent zu kommen) aber das Prinzip ist dasselbe:


static int GetDecimalPlaceCount(decimal value)
{
// Alle Bits außer Exponent auf 0 setzen und nach rechts schieben um den Wert zu erhalten.
return (Decimal.GetBits(value)[3] & 0x0ff0000) >> 0x10;
}

Klarer wirds noch bei der Lektüre der Decimal.GetBits() Doku: http://msdn.microsoft.com/de-de/library/system.decimal.getbits(v=VS.80).aspx

Wen es noch interessiert wie man an Mantisse, Exponent bei Double kommt, sei dieser MSDN Blog empfohlen:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/17/looking-inside-a-double.aspx

 

Logge dich ein, um hier zu kommentieren!