(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Double.Equals-Methode (Double)

Gibt einen Wert zurück, der angibt, ob diese Instanz und ein angegebenes Double-Objekt den gleichen Wert darstellen.

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

public bool Equals(
	double obj
)

Parameter

obj
Typ: System.Double
Ein mit dieser Instanz zu vergleichendes Double-Objekt.

Rückgabewert

Typ: System.Boolean
true , wenn obj gleich dieser Instanz ist, andernfalls false.

Implementiert

IEquatable<T>.Equals(T)

Diese Methode implementiert die System.IEquatable<T>-Schnittstelle und ist leistungsfähiger als Equals, da sie den obj-Parameter nicht in ein Objekt konvertieren muss.

Erweiternde Konvertierungen

Je nach der verwendeten Programmiersprache ist es eventuell möglich, eine Equals-Methode zu codieren, bei der der Parametertyp weniger Bits aufweist (also schmaler ist) als der Instanzentyp. Dies ist möglich, weil einige Programmiersprachen eine implizite Erweiterungskonvertierung durchführen, bei der der Parameter als Typ mit ebenso vielen Bits wie die Instanz dargestellt wird.

Nehmen Sie beispielsweise an, dass es sich beim Instanztyp um Double und beim Parametertyp um Int32 handelt. Der Microsoft C#-Compiler generiert Anweisungen, um den Wert des Parameters als ein Double-Objekt darzustellen. Anschließend generiert er eine Double.Equals(Double)-Methode, die die Werte der Instanz und der erweiterten Parameterdarstellung vergleicht.

Informationen dazu, ob der Compiler für die von Ihnen verwendete Programmiersprache implizite erweiternde Konvertierungen numerischer Typen durchführt, entnehmen Sie der Dokumentation zur verwendeten Programmiersprache. Weitere Informationen finden Sie im Thema Typkonvertierungstabellen.

Genauigkeit in Vergleichen

Die Equals-Methode sollte mit Bedacht verwendet werden, da zwei offensichtlich gleiche Werte aufgrund einer unterschiedlichen Genauigkeit der beiden Werte ungleich sein können. Im folgenden Beispiel wird gemeldet, dass Double der Wert .333333 und der Wert Double, der zurückgegeben wird, indem 1 durch 3 dividiert, ungleich sind.


// Initialize two doubles with apparently identical values
double double1 = .33333;
double double2 = 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2));    // displays false


Anstatt, Vergleichen auf Gleichheit, beinhaltet eine Technik mit ein, einen akzeptablen relativen Rand des Unterschieds zwischen zwei Werten zu definieren (z .001% von einem der Werte). Wenn der absolute Wert des Unterschieds zwischen den zwei Werten kleiner oder gleich diesem Unterschied ist, führen vermutlich unterschiedliche Genauigkeiten zu der Differenz, und die Werte sind daher wahrscheinlich gleich. Im folgenden Beispiel werden mit diesem Verfahren 0,33333 und 1/3 verglichen, d. h. die beiden Double-Werte, die im vorhergehenden Beispiel ungleich waren. In diesem Fall sind die Werte gleich.


// Initialize two doubles with apparently identical values
double double1 = .333333;
double double2 = (double) 1/3;
// Define the tolerance for variation in their values
double difference = Math.Abs(double1 * .00001);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(double1 - double2) <= difference)
   Console.WriteLine("double1 and double2 are equal.");
else
   Console.WriteLine("double1 and double2 are unequal.");


HinweisHinweis

Da Epsilon den Mindestausdruck eines positiven Werts definiert, dessen Bereich nahe 0 (null) ist, muss der Unterschied zwischen zwei ähnlichen Werten größer als Epsilon sein. Normalerweise ist er deutlich größer als Epsilon. Daher wird empfohlen, Epsilon nicht verwenden, wenn Sie Double-Werte Gleichheit vergleichen.

Eine zweite Möglichkeit, scrollen der Unterschied zwischen zwei Gleitkommazahlen vergleichen in einige absolute Wert. Wenn der Unterschied kleiner oder gleich diesem absoluten Wert ist, werden die Zahlen gleich. Wenn sie höher ist, werden die Zahlen nicht gleich. Eine Alternative wäre, einen absoluten Wert willkürlich auszuwählen. Dies ist jedoch schwierig da sich hierbei um eine lohnende Rand des Unterschiedes von der Größe der Double-Werte abhängt. Eine zweite Alternative nutzt ein Entwurfsfeature des Gleitkommaformats: Der Unterschied zwischen der ganzzahligen Darstellung von zwei Gleitkommawerten gibt die Anzahl der potenziellen Gleitkommawerten an, die getrennt. Beispielsweise ist der Unterschied zwischen 0,0 und Epsilon 1, weil Epsilon der kleinste darstellbare Wert bei der Arbeit mit Double ist, dessen Wert null ist. Im folgenden Beispiel wird diese Technik, .33333 und 1/3 vergleichen, die die zwei Double-Werte sind, die das vorherige Codebeispiel mit der Equals(Double)-Methode diese sind, die gesucht wird, die ungleich sind. Beachten Sie, dass im Beispiel die BitConverter.DoubleToInt64Bits-Methode verwendet, um eine Gleitkommazahl mit doppelter Genauigkeit die ganzzahligen Darstellung zu konvertieren.


using System;

public class Example
{
   public static void Main()
   {
      double value1 = .1 * 10;
      double value2 = 0;
      for (int ctr = 0; ctr < 10; ctr++)
         value2 += .1;

      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1));
   }

   public static bool HasMinimalDifference(double value1, double value2, int units)
   {
      long lValue1 = BitConverter.DoubleToInt64Bits(value1);
      long lValue2 = BitConverter.DoubleToInt64Bits(value2);

      // If the signs are different, return false except for +0 and -0.
      if ((lValue1 >> 63) != (lValue2 >> 63))
      {
         if (value1 == value2)
            return true;

         return false;
      }

      long diff = Math.Abs(lValue1 - lValue2);

      if (diff <= (long) units)
         return true;

      return false;
   }
}
// The example displays the following output:
//        01 = 0.99999999999999989: True


Die Genauigkeit von Gleitkommazahlen über die dokumentierte Genauigkeit hinaus ist von der Implementierung und Version von .NET Framework abhängig. Daher ist ein Vergleich von zwei bestimmten Zahlen in verschiedenen Versionen von .NET Framework möglicherweise unterschiedlich, da die Genauigkeit der internen Darstellung der Zahlen verschieden sein kann.

Wenn zwei Double.NaN-Werte für Gleichheit getestet werden, indem die Equals-Methode aufruft, gibt die Methode true zurück. Wenn jedoch zwei NaN-Werte für Gleichheit getestet werden, indem der Gleichheitsoperator verwenden, gibt der Operator false zurück. Wenn Sie feststellen möchten, ob der Wert von Double keine Zahl (NaN) ist, ist ein alternativer, die IsNaN-Methode aufzurufen.

.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

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

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft