Ho una matrice di float in cui i dati sono memorizzati con decimali diversi, quindi alcuni sono 123.40000
, 123.45000
, 123.45600
... ora se voglio stampare questi valori nella stringa senza gli 0 in la fine in printf()
in modo che siano 123.4
, 123.45
, 123.456
, senza quegli 0 alla fine. È possibile? Se é cosi, come?Formattazione a virgola mobile in printf()
risposta
Utilizzare l'% g formattatore:
printf("%g", 123.4000);
stampe
123,4
zeri finali vengono rimossi, ma purtroppo così è il punto decimale seguente, se la parte frazionaria è zero. Non so se v'è in realtà un modo di fare quello che vuoi direttamente utilizzando printf() - credo che qualcosa di simile è probabilmente la scelta migliore:
#include <stdio.h>
#include <math.h>
void print(FILE * f, double d) {
if (d - floor(d) == 0.0) {
fprintf(f, "%g.", d);
}
else {
fprintf(f, "%g", d);
}
}
int main() {
print(stdout, 12.0);
print(stdout, 12.300);
}
Uso% g -
Stampa un doppio in notazione normale o esponenziale, a seconda di quale sia più appropriato per la sua grandezza. 'g' usa lettere minuscole, 'G' usa lettere maiuscole. Questo tipo differisce leggermente dalla notazione a virgola fissa in cui non sono inclusi gli zeri insignificanti a destra del punto decimale. Inoltre, il punto decimale non è incluso nei numeri interi.
solo una piccola query, cosa succede se voglio rimuovere gli zeri finali ma voglio mantenere il numero decimale in numeri interi, come 124.00000 è 123. – sfactor
Non so come hacky questo non è che:
float f = 124.000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
Returns 124.0
.
float f = 124.123000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
Resi 124.123
.
Stampa su un buffer (abbastanza grande). Stampa il buffer ... e se non c'è il '.'
nel buffer stampa un punto.
char buf[100];
sprintf(buf, "%g", val);
printf("%s", buf);
if (strchr(buf, '.') == NULL) putchar('.');
modificare
La norma specifica la bandiera #
:
# Il risultato viene convertito in un `` forma alternativa ''. [...] Per le conversioni a, A, e, E, f, F, g e G, il risultato della conversione di un numero a virgola mobile contiene sempre un carattere decimale, anche se nessuna cifra segue . [...] Per le conversioni g e G, gli zero finali non vengono rimossi dal risultato . [...]
... ma si ottiene l'zeri finali :(
- 1. LCC printf in virgola mobile
- 2. formattazione virgola mobile Numbers
- 3. formato stringa per valori in virgola mobile printf
- 4. Impostazione locale di formattazione in virgola mobile per JSF/ICEfaces?
- 5. Numeri a virgola mobile a virgola fissa in C/C++
- 6. Comportamento in virgola mobile errato
- 7. Un'altra domanda a virgola mobile
- 8. Libreria per virgola mobile in virgola mobile Math in .NET
- 9. Coseno in virgola mobile
- 10. Converti virgola mobile in virgola mobile (SQL Server)
- 11. Confronto a virgola mobile in AWL, BOOST
- 12. conversione in virgola mobile in virgola mobile a 32 bit in Java
- 13. Corrispondenza printf Formattazione con iomanip
- 14. printf e regole di formattazione
- 15. problemi nel confronto in virgola mobile
- 16. Conversione da virgola mobile IBM a standard in virgola mobile IEEE e Vice Versa- In C#?
- 17. Tipi a virgola mobile a dimensione fissa
- 18. Interpolazione variabile all'interno delle funzioni di formattazione stile printf
- 19. Precisione arbitraria in virgola mobile Python disponibile?
- 20. In che modo printf e scanf gestiscono i formati di precisione in virgola mobile?
- 21. C - arrotondamento in virgola mobile
- 22. Precisione limite in virgola mobile?
- 23. Converti esadecimale in virgola mobile
- 24. Codifica in virgola mobile Raw
- 25. Esistono "anomalie" di confronto a virgola mobile?
- 26. Gestione delle eccezioni a virgola mobile
- 27. Conversione da esadecimale a virgola mobile comune
- 28. Ottimizzazioni a virgola mobile - linea guida
- 29. ruby errori in virgola mobile
- 30. Formato numero in virgola mobile
Non è una cattiva idea di confrontare raddoppia? "Se (D-piano (d) == 0.0)" ? – himself
@himself No, va bene quando sai cosa stai facendo. "Non confrontare mai i numeri in virgola mobile per" == "" è solo un'approssimazione per i non sofisticati. –