Во-первых, важно знать, что числа с плавающей запятой аппроксимируются. Посмотрите ссылку, предоставленную @Greg Hewgill, чтобы понять, почему эта проблема не полностью решаема.
Но вот пара решений проблемы, которые, вероятно, удовлетворят ваши потребности:
Возможно, лучший метод, но менее эффективный:
char sz[64];
double lf = 0.600000002;
sprintf(sz, "%.4lf\n", lf); //sz contains 0.6000
double lf2 = atof(sz);
//lf == 0.600000002;
//lf2 == 0.6000
printf("%.4lf", lf2); //print 0.6000
Более эффективный способ, но, вероятно, менее точный:
double lf = 0.600000002;
int iSigned = lf > 0? 1: -1;
unsigned int uiTemp = (lf*pow(10, 4)) * iSigned; //Note I'm using unsigned int so that I can increase the precision of the truncate
lf = (((double)uiTemp)/pow(10,4) * iSigned);