¿Cómo convertir doble a int en C?

double a; a = 3669.0; int b; b = a; 

Estoy recibiendo 3668 en b, en lugar de 3669.

¿Cómo soluciono este problema? Y si tengo 3559.8 así también quiero 3559 no 3560.

Sospecho que en realidad no tienes ese problema. Sospecho que realmente tienes:

 double a = callSomeFunction(); // Examine a in the debugger or via logging, and decide it's 3669.0 // Now cast int b = (int) a; // Now a is 3668 

Lo que me hace decir que es que, si bien es cierto que muchos valores decimales no se pueden almacenar exactamente en float o double , eso no es válido para los enteros de este tipo de magnitud. Muy fácilmente se pueden representar exactamente en forma de punto flotante binario. (Los enteros muy grandes no siempre pueden representarse exactamente, pero aquí no estamos tratando con un entero muy grande).

Sospecho fuertemente que su double valor es en realidad un poco menos de 3669.0, pero se le muestra como 3669.0 por cualquier dispositivo de diagnóstico que esté usando. La conversión a un valor entero simplemente realiza el truncamiento, no el redondeo, de ahí el problema.

Suponiendo que su tipo double es un tipo IEEE-754 de 64 bits, el valor más grande que es menor que 3669.0 es exactamente

 3668.99999999999954525264911353588104248046875 

Entonces, si está utilizando cualquier enfoque de diagnóstico donde ese valor se mostraría como 3669.0, entonces es muy posible (probablemente, diría) que esto es lo que está sucediendo.

 main() { double a; a=3669.0; int b; b=a; printf("b is %d",b); } 

la salida es: b is 3669

cuando escribes b = a; entonces se convierte automáticamente en int

 see on-line compiler result : 

http://ideone.com/60T5b

Este es el notorio problema de redondeo de punto flotante. Sólo agregue un número muy pequeño, para corregir el problema.

 double a; a=3669.0; int b; b=a+ 1e-9; 
 int b; double a; a=3669.0; b=a; printf("b=%d",b); 

este código da la salida como b = 3669 solo usted lo verifica claramente.