Sprache: VB
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
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
Alte URL:
/snippet/anzahl-der-nachkommastellen-einer-dezimalzahl-bestimmen/1583
„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:
[code]
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;
}
[/code]
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