2009-07-21 4 views
1

Kennt jemand eine elegante Möglichkeit, nur den Dezimalteil einer Zahl zu erhalten? Insbesondere suche ich nach der genauen Anzahl der Nachkommastellen, damit die Zahl entsprechend formatiert werden kann. Ich frage mich, wenn es weg ist diese Schnur Extraktion ohne jede Art zu tun, um die kulturspezifischen Dezimaltrennzeichen ....Erhalte den Dezimalteil einer Zahl und die Anzahl der Nachkommastellen (C#)

Zum Beispiel
98,0 würde als 98
98,20 formatiert werden würde als 98,2
formatiert werden 98.2765 würde als 98.2765 usw. formatiert werden.

+2

Warum kann man nur Double.ToString() für die Formatierung verwenden? Das würde Ihnen die gewünschten Ergebnisse liefern. – weiqure

+0

Siehe Kommentar unten auf Fredriks Post .... gleiche Antwort. Danke –

Antwort

5

Es ist nur für Formatierungszwecke, rufen Sie einfach ToString wird den Trick, denke ich?

double d = (double)5/4; 
Console.WriteLine(d.ToString()); // prints 1.75 
d = (double)7/2; 
Console.WriteLine(d.ToString()); // prints 3.5 
d = 7; 
Console.WriteLine(d.ToString()); // prints 7 

Das wird natürlich, formatieren Sie die Zahl entsprechend der aktuellen Kultur (was bedeutet, dass das Dezimalzeichen, Tausendertrennzeichen und so variieren).

aktualisieren

Wie Clement H in den Kommentaren weist darauf hin; Wenn es sich um große Zahlen handelt, gibt d.ToString() irgendwann eine Zeichenfolge mit wissenschaftlicher Formatierung zurück (z. B. "1E+16" anstelle von "10000000000000000"). Eine Möglichkeit, dieses Problem zu lösen und die vollständige Nummer zum Ausdruck zu bringen, besteht darin, d.ToString("0.#") zu verwenden, was ebenfalls zu der gleichen Ausgabe für niedrigere Zahlen führt, wie das obige Codebeispiel erzeugt.

+0

Ah. Ich wusste nicht, dass es so einfach war. Dumme Frage .... (Ich bin an VBA gewöhnt ...) –

+1

Was ich jetzt realisiere kann das gleiche Ergebnis mit Cstr geben ... Ich entschuldige mich –

+1

IMO das ist kein guter Weg, denn mit sehr hoher Nummer, yourNumber.toString() wird nicht zurückgegeben "1000000000000" aber "1.0E12 ". Wenn es nur für die Anzeige ist, ist es in Ordnung, aber zählen Sie nicht darauf, wenn es für Mathe in Ihrem Code ist. –

4

Sie können alle relevanten Informationen aus der Decimal.GetBits-Methode erhalten, vorausgesetzt, Sie meinen wirklich System.Decimal. (Wenn Sie über die Dezimalformatierung eines Floats/Double sprechen, klären Sie bitte die Frage.)

Grundsätzlich GetBits wird Ihnen 4 ganze Zahlen in einem Array zurückgeben. Sie können den Skalierungsfaktor (die vierte Ganzzahl nach dem Ausblenden des Vorzeichens) verwenden, um die Anzahl der Dezimalstellen anzugeben. Sie sollten jedoch beachten, dass dies nicht unbedingt die signifikante Dezimalstellen ist. Insbesondere sind die Dezimaldarstellungen von 1 und 1.0 unterschiedlich (ersterer ist 1/1, letzterer ist 10/10).

Leider erfordert die Manipulation der 96-Bit-Ganzzahl einige fiddly Arithmetik, es sei denn, Sie können .NET 4.0 und BigInteger verwenden.

Um ehrlich zu sein, erhalten Sie eine einfachere Lösung mit der integrierten Formatierung mit CultureInfo.InvariantCulture und dann alles auf der rechten Seite von "."

0

Sie könnten die Funktion Int() verwenden, um die ganze Zahlenkomponente zu erhalten, und dann vom Original subtrahieren.

2

einfach auf den Punkt, um GetBITS zu erweitern, dieser Ausdruck bekommt den Skalierungsfaktor aus Dezimalzahl genannt foo:

(decimal.GetBits(foo)[3] & 16711680)>>16