Single.Equals Metoda

Definicja

Zwraca wartość wskazującą, czy dwa wystąpienia Single reprezentują tę samą wartość.Returns a value indicating whether two instances of Single represent the same value.

Przeciążenia

Equals(Object)

Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi.Returns a value indicating whether this instance is equal to a specified object.

Equals(Single)

Zwraca wartość wskazującą, czy to wystąpienie i określony Single obiekt reprezentują tę samą wartość.Returns a value indicating whether this instance and a specified Single object represent the same value.

Equals(Object)

Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi.Returns a value indicating whether this instance is equal to a specified object.

public:
 override bool Equals(System::Object ^ obj);
public override bool Equals (object obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean

Parametry

obj
Object

Obiekt, który ma zostać porównany z tym wystąpieniem.An object to compare with this instance.

Zwraca

Boolean

true Jeśli obj jest wystąpieniem Single i jest równa wartości tego wystąpienia; w przeciwnym razie, false .true if obj is an instance of Single and equals the value of this instance; otherwise, false.

Przykłady

Poniższy przykład kodu demonstruje Equals metodę.The following code example demonstrates the Equals method.

obj1 = (Single)500;

if ( a.Equals( obj1 ) )
{
   Console::WriteLine( "The value type and reference type values are equal." );
}
obj1 = (Single)500;
if (a.Equals(obj1)) {
    Console.WriteLine("The value type and reference type values are equal.");
}
Obj1 = CType(500, Single)

If A.Equals(Obj1) Then
    Console.WriteLine("The value type and reference type values are equal.")
End If

Uwagi

EqualsMetoda powinna być stosowana z zachowaniem ostrożności, ponieważ dwie równoważne wartości mogą być nierówne z powodu różnej dokładności dwóch wartości.The Equals method should be used with caution, because two apparently equivalent values can be unequal due to the differing precision of the two values. Poniższy przykład zgłasza, że Single wartość. 3333 i Single zwrócone przez podział 1 przez 3 są różne.The following example reports that the Single value .3333 and the Single returned by dividing 1 by 3 are unequal.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

Zamiast porównywania pod kątem równości, jedna zalecana technika obejmuje zdefiniowanie akceptowalnego marginesu różnicy między dwiema wartościami (na przykład .01% jednej z wartości).Rather than comparing for equality, one recommended technique involves defining an acceptable margin of difference between two values (such as .01% of one of the values). Jeśli wartość bezwzględna różnicy między dwoma wartościami jest mniejsza niż lub równa marginesowi, różnica jest prawdopodobnie spowodowana różnicami i dlatego wartości mogą być równe.If the absolute value of the difference between the two values is less than or equal to that margin, the difference is likely to be due to differences in precision and, therefore, the values are likely to be equal. W poniższym przykładzie zastosowano tę technikę do porównania. 33333 i 1/3, dwie Single wartości, które nie zostały odnalezione przez poprzedni przykład kodu.The following example uses this technique to compare .33333 and 1/3, the two Single values that the previous code example found to be unequal.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - (float) float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - CSng(single2)) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

W takim przypadku wartości są równe.In this case, the values are equal.

Uwaga

Ponieważ Epsilon definiuje minimalne wyrażenie wartości dodatniej, której zakres jest bliski zero, margines różnicy musi być większy niż Epsilon .Because Epsilon defines the minimum expression of a positive value whose range is near zero, the margin of difference must be greater than Epsilon. Zwykle jest to wiele razy większe niż Epsilon .Typically, it is many times greater than Epsilon.

Dokładność liczb zmiennoprzecinkowych poza udokumentowaną dokładnością jest określona dla implementacji oraz wersji systemu .NET Framework.The precision of floating-point numbers beyond the documented precision is specific to the implementation and version of the .NET Framework. W związku z tym porównanie dwóch określonych liczb może ulec zmianie między wersji systemu .NET Framework, ponieważ precyzja przedstawienia numeracji wewnętrznej może ulec zmianie.Consequently, a comparison of two particular numbers might change between versions of the .NET Framework because the precision of the numbers' internal representation might change.

Uwagi dotyczące wywoływania

Rozwiązanie do przeciążenia kompilatora może uwzględniać pozorną różnicę w zachowaniu dwóch Equals(Object) przeciążeń metod.Compiler overload resolution may account for an apparent difference in the behavior of the two Equals(Object) method overloads. Jeśli niejawna konwersja między obj argumentem a Single jest zdefiniowana, a argument nie jest typem jako Object , kompilatory mogą wykonać niejawną konwersję i wywołać Equals(Single) metodę.If an implicit conversion between the obj argument and a Single is defined and the argument is not typed as an Object, compilers may perform an implicit conversion and call the Equals(Single) method. W przeciwnym razie wywołuje Equals(Object) metodę, która zawsze zwraca wartość, false Jeśli jej obj argument nie jest Single wartością.Otherwise, they call the Equals(Object) method, which always returns false if its obj argument is not a Single value. Poniższy przykład ilustruje różnice w zachowaniu między dwoma przeciążeniami metod.The following example illustrates the difference in behavior between the two method overloads. W przypadku wszystkich pierwotnych typów liczbowych, z wyjątkiem Double w Visual Basic i z wyjątkiem Decimal i Double w języku C#, pierwsze porównanie zwraca, true ponieważ kompilator automatycznie wykonuje konwersję rozszerzającą i wywołuje Equals(Single) metodę, podczas gdy false kompilator wywołuje Equals(Object) metodę.In the case of all primitive numeric types except for Double in Visual Basic and except for Decimal and Double in C#, the first comparison returns true because the compiler automatically performs a widening conversion and calls the Equals(Single) method, whereas the second comparison returns false because the compiler calls the Equals(Object) method.

[! code-CSharpSystem. Single. Equals # 2] [! code — VBSystem. Single. Equals # 2][!code-csharpSystem.Single.Equals#2] [!code-vbSystem.Single.Equals#2]

Zobacz też

Dotyczy

Equals(Single)

Zwraca wartość wskazującą, czy to wystąpienie i określony Single obiekt reprezentują tę samą wartość.Returns a value indicating whether this instance and a specified Single object represent the same value.

public:
 virtual bool Equals(float obj);
public bool Equals (float obj);
override this.Equals : single -> bool
Public Function Equals (obj As Single) As Boolean

Parametry

obj
Single

Obiekt, który ma zostać porównany z tym wystąpieniem.An object to compare with this instance.

Zwraca

Boolean

true Jeśli obj jest równe temu wystąpieniu; w przeciwnym razie, false .true if obj is equal to this instance; otherwise, false.

Implementuje

Uwagi

Ta metoda implementuje System.IEquatable<T> interfejs i wykonuje nieco lepsze niż, Equals ponieważ nie musi skonwertować obj parametru do obiektu.This method implements the System.IEquatable<T> interface, and performs slightly better than Equals because it does not have to convert the obj parameter to an object.

Poszerzenie konwersjiWidening Conversions

W zależności od języka programowania może być możliwe kod metody, w Equals której typ parametru ma mniejszą liczbę bitów (jest węższy) niż typ wystąpienia.Depending on your programming language, it might be possible to code an Equals method where the parameter type has fewer bits (is narrower) than the instance type. To jest możliwe, ponieważ w niektórych językach programowania jest wykonywana niejawna konwersja poszerzająca, która powoduje reprezentowanie parametru jako typu z taką samą liczbą bitów jak liczba bitów wystąpienia.This is possible because some programming languages perform an implicit widening conversion that represents the parameter as a type with as many bits as the instance.

Załóżmy na przykład, że typ wystąpienia to Single i typ parametru to Int32 .For example, suppose the instance type is Single and the parameter type is Int32. Kompilator języka C# firmy Microsoft generuje instrukcje do reprezentowania wartości parametru jako Single obiektu, a następnie generuje Single.Equals(Single) metodę, która porównuje wartości wystąpienia i poszerzonną reprezentację parametru.The Microsoft C# compiler generates instructions to represent the value of the parameter as a Single object, and then generates a Single.Equals(Single) method that compares the values of the instance and the widened representation of the parameter.

Sprawdź dokumentację języka programowania, aby określić, czy jego kompilator wykonuje niejawne poszerzenia konwersji dla typów liczbowych.Consult your programming language's documentation to determine if its compiler performs implicit widening conversions of numeric types. Aby uzyskać więcej informacji, zobacz temat tabele konwersji typów .For more information, see the Type Conversion Tables topic.

Precyzja w porównaniachPrecision in Comparisons

EqualsMetoda powinna być stosowana z zachowaniem ostrożności, ponieważ dwie równoważne wartości mogą być nierówne, ponieważ różnią się dokładnością dwóch wartości.The Equals method should be used with caution, because two apparently equivalent values can be unequal because of the differing precision of the two values. Poniższy przykład zgłasza, że Single wartość. 3333 i Single zwrócone przez podział 1 przez 3 są różne.The following example reports that the Single value .3333 and the Single returned by dividing 1 by 3 are unequal.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

Jedną techniką porównywania, która pozwala uniknąć problemów związanych z porównaniem równości, jest zdefiniowanie akceptowalnego marginesu różnicy między dwiema wartościami (na przykład .01% jednej z wartości).One comparison technique that avoids the problems associated with comparing for equality involves defining an acceptable margin of difference between two values (such as .01% of one of the values). Jeśli wartość bezwzględna różnicy między dwoma wartościami jest mniejsza lub równa marginesowi, różnica może być wynikiem różnic dokładności i dlatego wartości mogą być równe.If the absolute value of the difference between the two values is less than or equal to that margin, the difference is likely to be an outcome of differences in precision and, therefore, the values are likely to be equal. W poniższym przykładzie zastosowano tę technikę do porównania. 33333 i 1/3, które są dwiema Single wartościami, których poprzedni przykład kodu nie jest równy.The following example uses this technique to compare .33333 and 1/3, which are the two Single values that the previous code example found to be unequal.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - single2) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

W takim przypadku wartości są równe.In this case, the values are equal.

Uwaga

Ponieważ Epsilon definiuje minimalne wyrażenie wartości dodatniej, której zakres jest bliski zero, margines różnicy musi być większy niż Epsilon .Because Epsilon defines the minimum expression of a positive value whose range is near zero, the margin of difference must be greater than Epsilon. Zwykle jest to wiele razy większe niż Epsilon .Typically, it is many times greater than Epsilon. Z tego powodu zaleca się, aby nie używać Epsilon podczas porównywania Double wartości równości.Because of this, we recommend that you do not use Epsilon when comparing Double values for equality.

Druga technika, która pozwala uniknąć problemów związanych z porównaniem pod kątem równości, polega na porównaniu różnicy między dwoma liczbami zmiennoprzecinkowymi z nieprawidłową wartością.A second technique that avoids the problems associated with comparing for equality involves comparing the difference between two floating-point numbers with some absolute value. Jeśli różnica jest mniejsza lub równa tej wartości bezwzględnej, liczby są równe.If the difference is less than or equal to that absolute value, the numbers are equal. Jeśli jest większa, liczby nie są równe.If it is greater, the numbers are not equal. Jednym ze sposobów, aby to zrobić, można arbitralnie wybrać wartość bezwzględną.One way to do this is to arbitrarily select an absolute value. Jest to jednak problematyczne, ponieważ akceptowalny margines różnic zależy od wielkości Single wartości.However, this is problematic, because an acceptable margin of difference depends on the magnitude of the Single values. Drugi sposób wykorzystuje funkcję projektowania formatu zmiennoprzecinkowego: różnica między składnikami mantysy w reprezentacjach liczb całkowitych dwóch wartości zmiennoprzecinkowych wskazuje liczbę możliwych wartości zmiennoprzecinkowych oddzielających dwie wartości.A second way takes advantage of a design feature of the floating-point format: The difference between the mantissa components in the integer representations of two floating-point values indicates the number of possible floating-point values that separates the two values. Na przykład różnica między 0,0 i Epsilon wynosi 1, ponieważ Epsilon jest najmniejszą reprezentacją wartości podczas pracy z, Single której wartość jest równa zero.For example, the difference between 0.0 and Epsilon is 1, because Epsilon is the smallest representable value when working with a Single whose value is zero. W poniższym przykładzie zastosowano tę technikę do porównania. 33333 i 1/3, czyli dwie Double wartości, których poprzedni przykład kodu z Equals(Single) metodą nie jest równy.The following example uses this technique to compare .33333 and 1/3, which are the two Double values that the previous code example with the Equals(Single) method found to be unequal. Należy zauważyć, że w przykładzie używane są BitConverter.GetBytes BitConverter.ToInt32 metody i do konwersji wartości zmiennoprzecinkowej o pojedynczej precyzji na reprezentację liczb całkowitych.Note that the example uses the BitConverter.GetBytes and BitConverter.ToInt32 methods to convert a single-precision floating-point value to its integer representation.

using System;

public class Example
{
   public static void Main()
   {
      float value1 = .1f * 10f;
      float value2 = 0f;
      for (int ctr = 0; ctr < 10; ctr++)
         value2 += .1f;
         
      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1));
   }

   public static bool HasMinimalDifference(float value1, float value2, int units)
   {
      byte[] bytes = BitConverter.GetBytes(value1);
      int iValue1 = BitConverter.ToInt32(bytes, 0);
      
      bytes = BitConverter.GetBytes(value2);
      int iValue2 = BitConverter.ToInt32(bytes, 0);
      
      // If the signs are different, return false except for +0 and -0.
      if ((iValue1 >> 31) != (iValue2 >> 31))
      {
         if (value1 == value2)
            return true;
          
         return false;
      }

      int diff = Math.Abs(iValue1 - iValue2);

      if (diff <= units)
         return true;

      return false;
   }
}
// The example displays the following output:
//        1 = 1.00000012: True
Module Example
   Public Sub Main()
      Dim value1 As Single = .1 * 10
      Dim value2 As Single = 0
      For ctr As Integer =  0 To 9
         value2 += CSng(.1)
      Next
               
      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1))
   End Sub

   Public Function HasMinimalDifference(value1 As Single, value2 As Single, units As Integer) As Boolean
      Dim bytes() As Byte = BitConverter.GetBytes(value1)
      Dim iValue1 As Integer =  BitConverter.ToInt32(bytes, 0)
      
      bytes = BitConverter.GetBytes(value2)
      Dim iValue2 As Integer =  BitConverter.ToInt32(bytes, 0)
      
      ' If the signs are different, Return False except for +0 and -0.
      If ((iValue1 >> 31) <> (iValue2 >> 31)) Then
         If value1 = value2 Then
            Return True
         End If           
         Return False
      End If

      Dim diff As Integer =  Math.Abs(iValue1 - iValue2)

      If diff <= units Then
         Return True
      End If

      Return False
   End Function
End Module
' The example displays the following output:
'       1 = 1.00000012: True

Dokładność liczb zmiennoprzecinkowych poza udokumentowaną dokładnością jest określona dla implementacji oraz wersji systemu .NET Framework.The precision of floating-point numbers beyond the documented precision is specific to the implementation and version of the .NET Framework. W związku z tym porównanie dwóch liczb może generować różne wyniki w zależności od wersji .NET Framework, ponieważ precyzja wewnętrznej reprezentacji cyfr może ulec zmianie.Consequently, a comparison of two numbers might produce different results depending on the version of the .NET Framework, because the precision of the numbers' internal representation might change.

Uwagi dotyczące wywoływania

Rozwiązanie do przeciążenia kompilatora może uwzględniać pozorną różnicę w zachowaniu dwóch Equals(Object) przeciążeń metod.Compiler overload resolution may account for an apparent difference in the behavior of the two Equals(Object) method overloads. Jeśli niejawna konwersja między obj argumentem a Single jest zdefiniowana, a argument nie jest typem jako Object , kompilatory mogą wykonać niejawną konwersję i wywołać Equals(Single) metodę.If an implicit conversion between the obj argument and a Single is defined and the argument is not typed as an Object, compilers may perform an implicit conversion and call the Equals(Single) method. W przeciwnym razie wywołuje Equals(Object) metodę, która zawsze zwraca wartość, false Jeśli jej obj argument nie jest Single wartością.Otherwise, they call the Equals(Object) method, which always returns false if its obj argument is not a Single value. Poniższy przykład ilustruje różnice w zachowaniu między dwoma przeciążeniami metod.The following example illustrates the difference in behavior between the two method overloads. W przypadku wszystkich pierwotnych typów liczbowych, z wyjątkiem Double w Visual Basic i z wyjątkiem Decimal i Double w języku C#, pierwsze porównanie zwraca, true ponieważ kompilator automatycznie wykonuje konwersję rozszerzającą i wywołuje Equals(Single) metodę, podczas gdy false kompilator wywołuje Equals(Object) metodę.In the case of all primitive numeric types except for Double in Visual Basic and except for Decimal and Double in C#, the first comparison returns true because the compiler automatically performs a widening conversion and calls the Equals(Single) method, whereas the second comparison returns false because the compiler calls the Equals(Object) method.

[! code-CSharpSystem. Single. Equals # 2] [! code — VBSystem. Single. Equals # 2][!code-csharpSystem.Single.Equals#2] [!code-vbSystem.Single.Equals#2]

Zobacz też

Dotyczy