2011-11-27 6 views
5

Quiero comparar 2 dobles pero sin todos los dígitos. por ejemplo tengo este doble 1.548799778 y este 1.547990978 y quiero comparar 1.xx de cada uno. ¿Cómo puedo "redondear" este doble a 1.xx? Gracias Comparar 2 dobles pero sin todos los dígitos en C

+0

¿Qué tipo de redondeo quieres? por ejemplo, redondeo o redondeo hacia abajo? –

+0

@AdrienPlisson: borré mi publicación ... gracias por tus explicaciones – Zakaria

+0

¿Quieres redondear o quieres trunc? –

Respuesta

4

para comparar que x y y son lo suficientemente cerca, algo así como

(x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6 

para redondear x uso floor(x) o ceil(x) como se sugiere por Jan Vorcak

Addenda : No estoy seguro de que va a trabajar para NaN (los detalles dan dolor de cabeza)

+3

En lugar de "x == 0 && y == 0" usaría simplemente "x == y", es más rápido si los dos números son iguales. –

5

Una técnica va a utilizar la función trunc así:

double d1, d2; 
d1 = 1.548799778; 
d2 = 1.547990978; 
if (trunc(d1*100) == trunc(d2*100)) { 
    // do your thing 
} 

Usando 100 porque quiere dos cifras decimales. Puede usar otros números si quiere más o menos decimales.

+0

¿Necesito importar cualquier lib para eso? porque su trunc es inválido en C99 – BlackM

+0

lo intenté con 10000000000 para obtener 1.xxxxxxxxxxx pero obtengo xxxxxxxxxx.xxxxxx – BlackM

2

Otra posibilidad es simplemente usar una comparación con la tolerancia.

if (fabs(a - b) <= tolerance) { .... } 

elija su tolerancia en cuanto a la precisión que desee.

Por ejemplo, puede elegir tolerancia para ser 0.001 para usar sobre los primeros 2 dígitos.

+0

podría no funcionar muy bien si tanto 'a' como' b' son números pequeños, como '1e- 6' y '2e-6' con tolerancia siendo' 1e-5'. Vea mi respuesta para una mejor sugerencia. –

+0

Sí, esto usa tolerancia absoluta y su método usa tolerancia relativa, pero el problema expuesto es solucionable usando solo este método, solo quiere un número pequeño de dígitos, parece 2, por lo que en este caso, este método debe ser suficiente. –

0

Lo siguiente puede tener el tiempo de ejecución más rápido, y es útil como una comparación general de variables de coma flotante.

if ( x-y < 0.01 && x-y > -0.01) 
0

puede utilizar Math.h funciones

double check(double number) 
{ 
    if (modf(number, 0) >= .5) 
     return number >= 0 ? ceil(number) : floor(number); 
    else 
     return number < 0 ? ceil(number) : floor(number); 
} 

double round(double number, unsigned int places) 
{ 
    double off = pow(10, places); 
    return check(number * off)/off; 
} 

if(round(1.548799778, 2) == round(1.547990978, 2)) 
{ 
} 
0

este debe ser considerablemente más rápido y configurable si es necesario. no se introduce herencia adicional

int compare(double a, double b) 
{ 
    static const double PRECISION = 0.0001; 
    if (a < b) 
     return b - a < PRECISION ? 0 : 1; 
    else 
     return a - b < PRECISION ? 0 : -1; 
} 
Cuestiones relacionadas