Pregunta

Necesito comparar la parte entera de dos dobles para la desigualdad y actualmente estoy haciendo esto:

int iA = (int)dA;
int iB = (int)dB;

if( iA != iB )
{
    ...
}

pero me pregunto si hay un mejor enfoque que este.

Gracias.

Si usara Math.Truncate () en lugar de un elenco a int, ¿sería correcto comparar los dos valores dobles resultantes para la igualdad?

Sobre los comentarios de notación húngara:

Nunca uso HN yo mismo, al menos en la forma en que la mayoría de la gente lo hace. Pero este es uno de estos casos raros en los que la semántica de una variable se relaciona directamente con su tipo. Podría haber elegido otra sintaxis como A_As_Integer y B_As_NonInteger, pero ¿cuál habría sido la diferencia entonces?

¿Fue útil?

Solución

Use Math.Truncate () es decir

if (Math.Truncate(x) == Math.Truncate(y))

[Editar] Se dio cuenta de que si está comparando partes enteras de dobles, la conversión a valores int primero corre el riesgo de desbordamientos en caso de que sus dobles estén fuera del rango que podría representarse como int.

Truncar devuelve un decimal o un doble, evitando este problema.

Otros consejos

Sí, ese es el mejor enfoque.

Suponiendo por su redacción en su pregunta, no está preocupado por redondear ... solo la parte entera en sí misma.

es decir. (int) 4.1 dará el mismo resultado que (int) 4.9

Como dijo Ovidio, si solo necesita las variables para la comparación, solo tendrá que emitir los dobles en la declaración de comparación. Solo miraba la teoría.

Personalmente, trato de evitar crear variables adicionales a menos que las necesite.

if ( (int)dA != (int)dB ) {
    ...
}

A medida que el código evoluciona con el tiempo, tener variables adicionales dando vueltas sin ningún propósito conduce a la confusión. Por supuesto, si necesita esas variables, ese es otro problema :)

Nota al margen: parece que estás intentando insinuar el tipo de datos mediante una simple notación húngara. ¿Puedo recomendar no hacer eso? Si debe anteponer información a sus variables, intente para qué sirve la variable, en lugar de su tipo. Si hace eso, los errores en el código pueden ser más fáciles de ver:

if ( (int)ageA != (int)idB ) {
    ...
}

En este caso, sin siquiera saber cuáles son los datos, ver que está tratando de comparar una 'edad' con una 'identificación' es una buena pista de que algo está mal aquí.

Estoy de acuerdo en que Truncate es lo que quieres.

Información útil de MSDN :

Truncar devuelve el número que queda después de descartar cualquier dígito fraccionario.

Se redondea al entero más cercano hacia cero.

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top