Single.Equals Método

Definición

Devuelve un valor que indica si dos instancias de Single representan el mismo valor.

Sobrecargas

Equals(Object)

Devuelve un valor que indica si esta instancia equivale a un objeto especificado.

Equals(Single)

Devuelve un valor que indica si esta instancia y un objeto Single especificado representan el mismo valor.

Equals(Object)

Devuelve un valor que indica si esta instancia equivale a un objeto especificado.

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

Parámetros

obj
Object

Objeto que se va a comparar con esta instancia.

Devoluciones

true si obj es una instancia de Single y es igual al valor de esta instancia; en caso contrario, false.

Ejemplos

En el ejemplo de código siguiente se muestra el Equals método .

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.");
}
let obj1 = single 500
if a.Equals obj1 then
    printfn "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

Comentarios

El Equals método debe usarse con precaución, ya que dos valores aparentemente equivalentes pueden ser diferentes debido a la precisión diferente de los dos valores. En el ejemplo siguiente se informa de que el Single valor .3333 y el Single devuelto dividiendo 1 por 3 son diferentes.

// 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 floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Compare them for equality
printfn $"{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

En lugar de comparar la igualdad, una técnica recomendada implica definir un margen aceptable de diferencia entre dos valores (como ,01 % de uno de los valores). Si el valor absoluto de la diferencia entre los dos valores es menor o igual que ese margen, es probable que la diferencia se deba a diferencias de precisión y, por lo tanto, es probable que los valores sean iguales. En el ejemplo siguiente se usa esta técnica para comparar .33333 y 1/3, los dos Single valores que el ejemplo de código anterior encontró que no son iguales.

// 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 floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Define the tolerance for variation in their values
let difference = abs (float1 * 0.0001f)

// Compare the values
// The output to the console indicates that the two values are equal
if abs (float1 - (float2 :?> float32)) <= difference then
    printfn "float1 and float2 are equal."
else
    printfn "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

En este caso, los valores son iguales.

Nota

Dado Epsilon que define la expresión mínima de un valor positivo cuyo intervalo está cerca de cero, el margen de diferencia debe ser mayor que Epsilon. Normalmente, es muchas veces mayor que Epsilon.

La precisión de los números de punto flotante más allá de la precisión documentada es específica de la implementación y la versión de .NET Framework. Por consiguiente, una comparación de dos números concretos podría cambiar entre versiones de .NET Framework porque la precisión de la representación interna de los números podría cambiar.

Notas a los autores de las llamadas

La resolución de sobrecarga del compilador puede tener en cuenta una diferencia aparente en el comportamiento de las dos Equals(Object) sobrecargas del método. Si se define una conversión implícita entre el obj argumento y y Single el argumento no está escrito como , Objectlos compiladores pueden realizar una conversión implícita y llamar al Equals(Single) método . De lo contrario, llaman al Equals(Object) método , que siempre devuelve false si su obj argumento no es un Single valor. En el ejemplo siguiente se muestra la diferencia de comportamiento entre las dos sobrecargas de método. En el caso de todos los tipos numéricos primitivos excepto Double en Visual Basic y excepto DoubleDecimal en C#, la primera comparación devuelve true porque el compilador realiza automáticamente una conversión de ampliación y llama al Equals(Single) método , mientras que la segunda comparación devuelve false porque el compilador llama al Equals(Object) método .

using System;

public class Example
{
   static float value = 112;
   
   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);
      
      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);
      
      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
let value = 112f

let testObjectForEquality (obj: obj) =
    printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"

[<EntryPoint>]
let main _ =
    let byte1= 112uy
    printfn $"value = byte1: {value.Equals byte1,16}"
    testObjectForEquality byte1

    let short1 = 112s
    printfn $"value = short1: {value.Equals short1,16}"
    testObjectForEquality short1

    let int1 = 112
    printfn $"value = int1: {value.Equals int1,18}"
    testObjectForEquality int1

    let long1 = 112L
    printfn $"value = long1: {value.Equals long1,17}"
    testObjectForEquality long1
    
    let sbyte1 = 112y
    printfn $"value = sbyte1: {value.Equals sbyte1,16}"
    testObjectForEquality sbyte1

    let ushort1 = 112us
    printfn $"value = ushort1: {value.Equals ushort1,16}"
    testObjectForEquality ushort1

    let uint1 = 112u
    printfn $"value = uint1: {value.Equals uint1,18}"
    testObjectForEquality uint1

    let ulong1 = 112uL
    printfn $"value = ulong1: {value.Equals ulong1,17}"
    testObjectForEquality ulong1
    
    let dec1 = 112m
    printfn $"value = dec1: {value.Equals dec1,21}"
    testObjectForEquality dec1

    let dbl1 = 112.
    printfn $"value = dbl1: {value.Equals dbl1,20}"
    testObjectForEquality dbl1
    0

// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
Module Example
   Dim value As Single = 112
   
   Public Sub Main()
      Dim byte1 As Byte = 112
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
      TestObjectForEquality(byte1)
      
      Dim short1 As Short = 112
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
      TestObjectForEquality(short1)

      Dim int1 As Integer = 112
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
      TestObjectForEquality(int1)

      Dim long1 As Long = 112
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
      TestObjectForEquality(long1)

      Dim sbyte1 As SByte = 112
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
      TestObjectForEquality(sbyte1)
      
      Dim ushort1 As UShort = 112
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
      TestObjectForEquality(ushort1)

      Dim uint1 As UInteger = 112
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
      TestObjectForEquality(uint1)

      Dim ulong1 As ULong = 112
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
      TestObjectForEquality(ulong1)
      
      Dim dec1 As Decimal = 112d
      Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
      TestObjectForEquality(dec1)

      Dim dbl1 As Double = 112
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
      TestObjectForEquality(dbl1)
   End Sub
   
   Private Sub TestObjectForEquality(obj As Object)
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj))
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'       value = byte1:             True
'       112 (Single) = 112 (Byte): False
'
'       value = short1:             True
'       112 (Single) = 112 (Int16): False
'
'       value = int1:               True
'       112 (Single) = 112 (Int32): False
'
'       value = long1:              True
'       112 (Single) = 112 (Int64): False
'
'       value = sbyte1:             True
'       112 (Single) = 112 (SByte): False
'
'       value = ushort1:             True
'       112 (Single) = 112 (UInt16): False
'
'       value = uint1:               True
'       112 (Single) = 112 (UInt32): False
'
'       value = ulong1:              True
'       112 (Single) = 112 (UInt64): False
'
'       value = dec1:                 True
'       112 (Single) = 112 (Decimal): False
'
'       value = dbl1:                False
'       112 (Single) = 112 (Double): False

Consulte también

Se aplica a

Equals(Single)

Devuelve un valor que indica si esta instancia y un objeto Single especificado representan el mismo valor.

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

Parámetros

obj
Single

Objeto que se va a comparar con esta instancia.

Devoluciones

true si obj es igual a esta instancia; en caso contrario, false.

Implementaciones

Comentarios

Para obtener más información sobre esta API, consulte Comentarios complementarios de api para Single.Equals.

Notas a los autores de las llamadas

La resolución de sobrecarga del compilador puede tener en cuenta una diferencia aparente en el comportamiento de las dos Equals(Object) sobrecargas del método. Si se define una conversión implícita entre el obj argumento y y Single el argumento no está escrito como , Objectlos compiladores pueden realizar una conversión implícita y llamar al Equals(Single) método . De lo contrario, llaman al Equals(Object) método , que siempre devuelve false si su obj argumento no es un Single valor. En el ejemplo siguiente se muestra la diferencia de comportamiento entre las dos sobrecargas de método. En el caso de todos los tipos numéricos primitivos excepto Double en Visual Basic y excepto DoubleDecimal en C#, la primera comparación devuelve true porque el compilador realiza automáticamente una conversión de ampliación y llama al Equals(Single) método , mientras que la segunda comparación devuelve false porque el compilador llama al Equals(Object) método .

using System;

public class Example
{
   static float value = 112;
   
   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);
      
      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);
      
      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
let value = 112f

let testObjectForEquality (obj: obj) =
    printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"

[<EntryPoint>]
let main _ =
    let byte1= 112uy
    printfn $"value = byte1: {value.Equals byte1,16}"
    testObjectForEquality byte1

    let short1 = 112s
    printfn $"value = short1: {value.Equals short1,16}"
    testObjectForEquality short1

    let int1 = 112
    printfn $"value = int1: {value.Equals int1,18}"
    testObjectForEquality int1

    let long1 = 112L
    printfn $"value = long1: {value.Equals long1,17}"
    testObjectForEquality long1
    
    let sbyte1 = 112y
    printfn $"value = sbyte1: {value.Equals sbyte1,16}"
    testObjectForEquality sbyte1

    let ushort1 = 112us
    printfn $"value = ushort1: {value.Equals ushort1,16}"
    testObjectForEquality ushort1

    let uint1 = 112u
    printfn $"value = uint1: {value.Equals uint1,18}"
    testObjectForEquality uint1

    let ulong1 = 112uL
    printfn $"value = ulong1: {value.Equals ulong1,17}"
    testObjectForEquality ulong1
    
    let dec1 = 112m
    printfn $"value = dec1: {value.Equals dec1,21}"
    testObjectForEquality dec1

    let dbl1 = 112.
    printfn $"value = dbl1: {value.Equals dbl1,20}"
    testObjectForEquality dbl1
    0

// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
Module Example
   Dim value As Single = 112
   
   Public Sub Main()
      Dim byte1 As Byte = 112
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
      TestObjectForEquality(byte1)
      
      Dim short1 As Short = 112
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
      TestObjectForEquality(short1)

      Dim int1 As Integer = 112
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
      TestObjectForEquality(int1)

      Dim long1 As Long = 112
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
      TestObjectForEquality(long1)

      Dim sbyte1 As SByte = 112
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
      TestObjectForEquality(sbyte1)
      
      Dim ushort1 As UShort = 112
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
      TestObjectForEquality(ushort1)

      Dim uint1 As UInteger = 112
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
      TestObjectForEquality(uint1)

      Dim ulong1 As ULong = 112
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
      TestObjectForEquality(ulong1)
      
      Dim dec1 As Decimal = 112d
      Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
      TestObjectForEquality(dec1)

      Dim dbl1 As Double = 112
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
      TestObjectForEquality(dbl1)
   End Sub
   
   Private Sub TestObjectForEquality(obj As Object)
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj))
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'       value = byte1:             True
'       112 (Single) = 112 (Byte): False
'
'       value = short1:             True
'       112 (Single) = 112 (Int16): False
'
'       value = int1:               True
'       112 (Single) = 112 (Int32): False
'
'       value = long1:              True
'       112 (Single) = 112 (Int64): False
'
'       value = sbyte1:             True
'       112 (Single) = 112 (SByte): False
'
'       value = ushort1:             True
'       112 (Single) = 112 (UInt16): False
'
'       value = uint1:               True
'       112 (Single) = 112 (UInt32): False
'
'       value = ulong1:              True
'       112 (Single) = 112 (UInt64): False
'
'       value = dec1:                 True
'       112 (Single) = 112 (Decimal): False
'
'       value = dbl1:                False
'       112 (Single) = 112 (Double): False

Consulte también

Se aplica a