Exportieren (0) Drucken
Alle erweitern

Decimal-Struktur

Aktualisiert: November 2007

Stellt eine Decimal-Zahl dar.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Decimal : IFormattable, IComparable, 
	IConvertible, IComparable<decimal>, IEquatable<decimal>
/** @attribute SerializableAttribute */ 
/** @attribute ComVisibleAttribute(true) */
public final class Decimal extends ValueType implements IFormattable, 
	IComparable, IConvertible, IComparable<Decimal>, IEquatable<Decimal>
JScript unterstützt die Verwendung von Strukturen, aber nicht die Deklaration von neuen Strukturen.

Der Decimal-Werttyp stellt Decimal-Zahlen im Bereich von -79.228.162.514.264.337.593.543.950.335 bis +79.228.162.514.264.337.593.543.950.335 dar. Der Decimal-Werttyp ist für finanzmathematische Berechnungen geeignet, bei denen zahlreiche signifikante Vor- und Nachkommastellen erforderlich sind und keine Rundungsfehler auftreten dürfen. Auch beim Decimal-Typ muss weiter gerundet werden. Vielmehr werden Rundungsfehler minimiert. Im folgenden Code wird z. B. das Ergebnis 0,9999999999999999999999999999 und nicht 1 zurückgegeben.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);   


Wenn das Ergebnis der Division und Multiplikation an die Round-Methode übergeben wird, bleibt die Genauigkeit des Ergebnisses erhalten, wie im folgenden Code dargestellt.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 1.00 to the console
Console.WriteLine(Math.Round(dividend/divisor * divisor, 2));   


Eine Decimal-Zahl ist ein Gleitkommawert, der aus einem Vorzeichen, einem numerischen Wert mit Ziffern zwischen 0 (null) und 9 sowie einem Skalierungsfaktor besteht, der die Position eines die Vor- und Nachkommastellen des numerischen Werts trennenden Gleitdezimaltrennzeichens angibt.

Die binäre Darstellung eines Decimal-Werts besteht aus einem 1-Bit-Vorzeichen, einer 96-Bit-Ganzzahl und einem Skalierungsfaktor, der zum Dividieren der 96-Bit-Ganzzahl verwendet wird und angibt, welcher Teil ein Dezimalbruch ist. Der Skalierungsfaktor ist implizit die Zahl 10 mit einem Exponent zwischen 0 und 28. Daher verfügt die binäre Darstellung eines Decimal-Werts über die Form ((-296 bis 296) / 10(0 bis 28)), wobei -296-1 gleich MinValue und 296-1 gleich MaxValue ist.

Der Skalierungsfaktor behält außerdem alle nachfolgenden Nullen in einer Decimal-Zahl bei. Nachfolgenden Nullen haben keine Auswirkungen auf den Wert einer Decimal-Zahl bei Vergleichs- und Arithmetikoperationen. Nachfolgende Nullen können jedoch von der ToString-Methode angezeigt werden, wenn eine entsprechende Formatzeichenfolge angewendet wird.

Konvertierungsüberlegungen

Dieser Typ stellt Methoden bereit, die Decimal-Werte in und aus den folgenden Typen konvertieren: SByte, Int16, Int32, Int64, Byte, UInt16, UInt32 und UInt64. Konvertierungen aus diesen ganzzahligen Typen in Decimal sind Erweiterungskonvertierungen, bei denen keine Informationen verloren gehen und keine Ausnahmen ausgelöst werden.

Konvertierungen von Decimal in einen der ganzzahligen Typen sind einschränkende Konvertierungen, die den Decimal-Wert in Richtung 0 (null) auf die nächste Ganzzahl runden. Einige Sprachen, z. B. C#, unterstützen auch die Konvertierung von Decimal-Werten in Char-Werte. Wenn das Ergebnis dieser Konvertierungen nicht im Zieltyp dargestellt werden kann, wird eine OverflowException ausgelöst.

Der Decimal-Typ stellt auch Methoden bereit, mit denen Decimal-Werte in und aus Single und Double konvertiert werden können. Konvertierungen von Decimal in Single oder Double sind einschränkende Konvertierungen, bei denen zwar ein Verlust an Genauigkeit, jedoch kein Verlust an Informationen über die Größe des konvertierten Werts auftreten kann. Die Konvertierung löst keine Ausnahme aus.

Konvertierungen von Single oder Double in Decimal lösen eine OverflowException aus, wenn das Ergebnis der Konvertierung nicht als Decimal dargestellt werden kann.

Implementierte Schnittstellen

Dieser Typ implementiert die Schnittstellen IComparable, IComparable<T>, IFormattable und IConvertible. Verwenden Sie für Konvertierungen die Convert-Klasse anstelle der expliziten Implementierung der Schnittstellenmember von IConvertible für diesen Typ.

Im folgenden Codebeispiel wird die Verwendung des Decimal veranschaulicht.

	/// <summary>
	/// Keeping my fortune in Decimals to avoid the round-off errors.
	/// </summary>
	class PiggyBank {
		protected decimal MyFortune;

		public void AddPenny() {
			MyFortune = Decimal.Add(MyFortune, .01m);
		}

		public decimal Capacity {
			get {
				return Decimal.MaxValue;
			}
		}

		public decimal Dollars {
			get {
				return Decimal.Floor(MyFortune);
			}
		}

		public decimal Cents {
			get {
				return Decimal.Subtract(MyFortune, Decimal.Floor(MyFortune));
			}
		}

		public override string ToString() {
			return MyFortune.ToString("C")+" in piggy bank";
		}
	}


/// <summary>
/// Keeping my fortune in Decimals to avoid the round-off errors.
/// </summary>
class PiggyBank
{
    protected System.Decimal myFortune;

    public void AddPenny()
    {
        myFortune = Decimal.Add(myFortune, System.Convert.ToDecimal(0.01));
    } //AddPenny

    /** @property 
     */
    public System.Decimal get_Capacity()
    {
        return Decimal.MaxValue;
    } //get_Capacity

    /** @property 
     */
    public System.Decimal get_Dollars()
    {
        return Decimal.Floor(myFortune);
    } //get_Dollars

    /** @property 
     */
    public System.Decimal get_Cents()
    {
        return Decimal.Subtract(myFortune, Decimal.Floor(myFortune));
    } //get_Cents

    public String ToString()
    {
        return myFortune.ToString("C") + " in piggy bank";
    } //ToString
} //PiggyBank


	/// <summary>
	/// Keeping my fortune in Decimals to avoid the round-off errors.
	/// </summary>
	class PiggyBank {
		protected var MyFortune : Decimal;

		public function AddPenny() {
			MyFortune = Decimal.Add(MyFortune, 0.01);
		}

		public function get Capacity() : Decimal {
		        return Decimal.MaxValue;
		}

		public function get Dollars() : Decimal {
			return Decimal.Floor(MyFortune);
		}

		public function get Cents() : Decimal {
			return Decimal.Subtract(MyFortune, Decimal.Floor(MyFortune));
		}

		public function ToString() : String {
			return MyFortune.ToString("C")+" in piggy bank";
		}
	}


Alle Member dieses Typs sind threadsicher. Member, die scheinbar den Zustand einer Instanz ändern, geben in Wirklichkeit eine neue Instanz zurück, die mit dem neuen Wert initialisiert wurde. Wie bei allen anderen Typen müssen Lese- und Schreibzugriffe auf eine freigegebene Variable, die eine Instanz dieses Typs enthält, durch eine Sperre geschützt werden, um Threadsicherheit zu garantieren.

1k2e8atx.alert_caution(de-de,VS.90).gifVorsicht:

Die Zuweisung einer Instanz dieses Typs ist nicht auf allen Hardwareplattformen threadsicher, da die binäre Darstellung der Instanz u. U. zu groß ist, sodass die Zuweisung nicht in einem einzelnen atomaren Vorgang abgeschlossen werden kann.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile für Smartphone, Windows Mobile für Pocket PC, Xbox 360

.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

.NET Framework

Unterstützt in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 3.5, 2.0, 1.0

XNA Framework

Unterstützt in: 2.0, 1.0

Community-Beiträge

HINZUFÜGEN
Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
Anzeigen:
© 2015 Microsoft