Come troncare un numero in virgola mobile dopo un determinato numero di posizioni decimali (nessun arrotondamento)?

Sto cercando di stampare il numero 684.545007 con una precisione di 2 punti nel senso che il numero deve essere troncato (non arrotondato) dopo 684.54 .

Quando lo uso

 var = 684.545007; printf("%.2f\n",var); 

emette 684.55 , ma quello che mi piacerebbe ottenere è 684.54 .

Qualcuno sa come posso correggere questo?

Quello che stai cercando è il troncamento . Questo dovrebbe funzionare (almeno per i numeri che non sono eccessivamente grandi):

 printf(".2f", ((int)(100 * var)) / 100.0); 

La conversione in intero tronca la parte frazionaria.

In C ++ 11 o C99, è ansible utilizzare la funzione dedicata trunc per questo scopo (dall’intestazione o . Ciò eviterà la restrizione ai valori che si adattano a un tipo integrale.

 std::trunc(100 * var) / 100 // no need for casts 

Ecco il mio approccio. Sembra brutto ma funziona nella maggior parte dei casi, ad esempio var può essere più grande di int, può essere zero o bizzarro ‘-0’. Tuttavia, non gestisce gli infiniti e i NaN.

 double var = 684.545007; // or whatever double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.; printf ("%g\n", var_trunc); 
 printf("%.2f\n", var - 0.005);