Pregunta

El siguiente código en C # no funciona:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

Entonces, la pregunta: ¿cuál es la mejor manera de comparar Double e Int?

¿Fue útil?

Solución

Realmente no se pueden comparar valores de coma flotante e integrales de una manera ingenua; particularmente, ya que existe el clásico coma flotante desafíos de representación . Lo que puede hacer es restar uno del otro y ver si la diferencia entre ellos es menor que la precisión que le interesa, así:

int iValue = 0;
double dValue = 0.0;

var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
   return true; // items equal

Realmente tienes que definir por ti mismo lo que igualdad significa para ti. Por ejemplo, es posible que desee que un valor de coma flotante se redondee hacia el entero más cercano, de modo que 3.999999981 sea "igual". a 4. O es posible que desee truncar el valor, por lo que efectivamente sería 3. Todo depende de lo que esté tratando de lograr.

EDITAR: Tenga en cuenta que elegí 0.0000001 como un valor umbral de ejemplo ... debe decidir por sí mismo qué precisión es suficiente para la comparación. Solo tenga en cuenta que necesita estar dentro de los límites de representación normales de double que creo que se define como Double.Epsilon .

Otros consejos

Es una idea extremadamente mala comparar números enteros y números de coma flotante para la igualdad en cualquier idioma. Funciona para casos muy simples, pero después de hacer cualquier cálculo, la probabilidad de que el programa haga lo que quiere disminuye drásticamente.

Tiene que ver con la forma en que los números de punto flotante se almacenan en un sistema binario digital.

Si está muy seguro de que desea usar esto, cree una clase para hacer su propio número con fracciones. use un int para mantener el número entero y otro int para mantener la fracción.

Esto realmente depende de lo que consideres "igual". Si desea que su comparación devuelva verdadero si y solo si el doble coincide exactamente con el valor entero (es decir, no tiene un componente fraccionario), debe convertir su int en un doble para hacer la comparación:

bool isEqual = (double)iValue == dValue;

Si algo como 1.1 se consideraría igual a 1, puede convertir el doble en un int (si desea ignorar por completo el componente fraccional) o redondear el doble si desea decir 1.9 para que sea igual a 2.

double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
    // Put your code here
}

      OR

if((val2 - Double.Epsilon) < 0)
{
    // Put your code here
}

donde Double.Epsilon es el valor más bajo posible para Double.

Hoy en día, casi la única vez que uno debería comparar valores de los tipos double y integer o long para una igualdad estricta es cuando, por alguna razón, uno está atascado almacenando o pasando cantidades integrales como valores de punto flotante y luego necesita volver a convertirlos. En la mayoría de los casos, dicha conversión puede lograrse más fácilmente al convertir el tipo integral en double y luego comparar el resultado de esa conversión. Tenga en cuenta que la conversión de long a double puede ser imprecisa si el número está fuera del rango ± 2 52 . No obstante, en los días previos a la disponibilidad de long de 64 bits, double era un tipo de almacenamiento útil para cantidades enteras que eran demasiado grandes para un int pero lo suficientemente pequeño como para ser manejado por double .

Tenga en cuenta que convertir un largo en double y luego hacer la comparación arrojará un " igual " resultado si el valor nominal del double no coincide exactamente con el valor long , pero representa el double más cercano posible a ese valor. Este comportamiento tiene sentido si uno reconoce que los tipos de punto flotante en realidad no representan un solo valor preciso, sino más bien un rango de valores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top