2013-10-24 29 views

risposta

1

L'unico modo semplice per eseguire questa operazione è utilizzare snprintf per stampare su un buffer sufficientemente lungo da contenere l'intero valore esatto, quindi troncarlo come stringa. Qualcosa di simile:

char buf[2*(DBL_MANT_DIG + DBL_MAX_EXP)]; 
snprintf(buf, sizeof buf, "%.*f", (int)sizeof buf, x); 
char *p = strchr(buf, '.'); // beware locale-specific radix char, though! 
p[2+1] = 0; 
puts(buf); 
+0

Oh! quindi il mio commento era corretto :), Quale file includere per 'DBL_MANT_DIG' e' DBL_MAX_EXP'? Perché moltiplicare per '2'?, Dovrebbe essere' buf [2 * (DBL_MANT_DIG + DBL_MAX_EXP) + 1] 'per nul-symbol? –

+1

'#include ' –

+1

BTW quella dimensione legata è un po 'più grande di quanto deve essere, ma non per ordine di grandezza, a meno che non si voglia aggiungere molta più logica. il più piccolo float richiede davvero 'DBL_MANT_DIG-DBL_MIN_EXP' (forse off-by-one) posti dopo il punto decimale per stampare esattamente, ma dal momento che il numero desiderato di posti è due, è possibile cortocircuitare i valori minuscoli direttamente a' 0.00' e gestiscono solo valori superiori a una soglia abbastanza grande, riducendo il numero di posizioni necessarie dopo il decimale a 'DBL_MANT_DIG' più una piccola costante. –

1

Io suggerirei più breve e più veloce approccio:

printf("%.2f", ((signed long)(fVal * 100) * 0.01f)); 

in questo modo non sarà troppo pieno int, oltre moltiplicazione per 100 non dovrebbe influenzare il significante/mantissa stesso, perché l'unica cosa che sta davvero cambiando è esponente.

+2

Questo non funziona. La moltiplicazione per 100 è lossy e introduce un arrotondamento. Fallisce anche se 'fVal' è maggiore di' INT_MAX/100'. –

Problemi correlati