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);