Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Double.Equals (Método) (Double)

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

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)

public bool Equals(
	double obj
)

Parámetros

obj
Tipo: System.Double
Objeto Double que se comparará con esta instancia.

Valor devuelto

Tipo: System.Boolean
Es true si obj es igual a esta instancia; en caso contrario, es false.

Implementaciones

IEquatable<T>.Equals(T)

Este método implementa la interfaz System.IEquatable<T> y se ejecuta un poco mejor que Equals, porque no tiene que convertir el parámetro obj en objeto.

Conversiones de ampliación

Dependiendo del lenguaje de programación, se podría codificar un método Equals en el que el tipo de parámetro tiene menos bits (es más estrecho) que el tipo de instancia. Esto es posible porque algunos lenguajes de programación realizan una conversión de ampliación implícita, que representa el parámetro como tipo con tantos bits como la instancia.

Por ejemplo, supongamos que el tipo de instancia es Double y que el tipo de parámetro es Int32. El compilador de Microsoft C# genera instrucciones para representar el valor del parámetro como objeto Double y, a continuación, genera un método Double.Equals(Double) que compara los valores de la instancia y la representación ampliada del parámetro.

Consulte la documentación del lenguaje de programación para determinar si el compilador realiza conversiones de ampliación de tipos numéricos implícitas. Para obtener más información, vea el tema Tablas de conversión de tipos.

Precisión en las comparaciones

El método Equals se debe utilizar con precaución, porque dos valores aparentemente equivalentes pueden ser distintos debido a la precisión diferente de los dos valores. Los informes de ejemplo siguientes que el valor .333333 de Double y el valor devuelto de Double dividir 1 por 3 son iguales.


// 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


En lugar de comparar para la igualdad, una técnica implica definir de un margen relativo aceptable de la diferencia entre dos valores (como .001% de uno de los valores). Si el valor absoluto de la diferencia entre los dos valores es menor o igual que el margen, es probable que la diferencia sea debida a las diferencias en precisión y, por consiguiente, es probable que los valores sean iguales. En el ejemplo siguiente se utiliza esta técnica para comparar ,33333 y 1/3, los dos valores Double que en el ejemplo de código anterior se vio que eran distintos. En este caso, los valores son iguales.


// 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.");


NotaNota

Dado que Epsilon define la expresión mínima de un valor positivo cuyo intervalo está cerca de cero, el margen de diferencia entre dos valores similares debe ser mayor que Epsilon. Normalmente, es muchas veces mayor que Epsilon. Debido a esto, se recomienda no utilizar Epsilon al comparar los valores de Double para comprobar la igualdad.

Una segunda técnica implica la comparación de la diferencia entre dos números de punto flotante con algún valor absoluto. Si la diferencia menor o igual que el valor absoluto, los números son iguales. Si es mayor, los números no son iguales. Una alternativa es seleccionar arbitrariamente un valor absoluto. Esto es problemático, sin embargo, porque un margen aceptable de diferencia depende de la magnitud de los valores de Double . Otra alternativa se aprovecha de una característica de diseño de formato flotante: La diferencia entre la representación completa de dos valores de punto flotante indica el número de valores de punto flotante posibles que los separa. Por ejemplo, la diferencia entre 0,0 y Epsilon es 1, porque Epsilon es el valor que se puede representar menor al ejecutar Double cuyo valor sea cero. El ejemplo siguiente se utiliza esta técnica para comparar .33333 y 1/3, que son los dos valores de Double esos el ejemplo de código anterior con el método de Equals(Double) encontrado para ser desigual. Observe que el ejemplo usa el método de BitConverter.DoubleToInt64Bits para convertir un valor de punto flotante de precisión doble en su representación de entero.


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


La precisión de los números de punto flotante distinta de la precisión documentada depende específicamente de la implementación y versión de .NET Framework. En consecuencia, la comparación de dos números concretos quizá difiera entre las versiones de .NET Framework puesto que puede variar la precisión de la representación interna de los números.

Si dos valores de Double.NaN son probados para la igualdad llamando al método de Equals , el método devuelve true. Sin embargo, si dos valores de NaN se comprueban la igualdad mediante el operador de igualdad, el operador devuelve false. Cuando desea determinar si el valor de Double no es un número (NaN), una alternativa consiste en llamar al método de IsNaN .

.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

.NET para aplicaciones de Windows Phone

Compatible con: 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 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft