Verwenden Sie sprintf formatieren Schwimmer, die keine Dezimalstellen, wenn integer
Ursprünglich war ich mit sprintf mit floats immer mit 2 Nachkommastellen verwenden Sie den folgenden code:
static void MyFunc(char* buffer, const float percentage)
{
sprintf(buffer, "%.2f", percentage);
}
Einer der Prozentwerte übergeben wurde 0x419FFFFF 20 (debugger-Ansicht), diese gedruckt 20.00 Uhr in den buffer.
Möchte ich stattdessen zeigen, 2 Dezimalstellen, wenn nicht eine ganze Zahl, z.B.
94.74 displayed as 94.74
94.7 displayed as 94.70
0 displayed as 0
5 displayed as 5
100 displayed as 100
Ich bin derzeit mit dem folgenden code:
static void MyFunc(char* buffer, const float percentage)
{
int fractional_part = ((percentage - (int)percentage) * 100);
if (0 == fractional_part)
{
sprintf(buffer, "%d", (int)percentage);
}
else
{
sprintf(buffer, "%.2f", percentage);
}
}
Nun, wenn 0x419FFFFF 20 (debugger-Ansicht) übergeben wird, Nachkommastellen berechnet als 99. Ich nehme an, dann ist die Summe für fractional_part endet als (19.99 - 19) * 100 = 99. Warum dann nicht das erste Beispiel nicht drucken 19.99 in den buffer?
Was ist die richtige Lösung für mein problem?
möglich, Duplikat der Nur zeigen, Dezimalpunkt, wenn Fließkomma-Komponente ist nicht .00 sprintf/printf
verwenden Sie "%g" anstelle von "%d", wie dies in dem oben genannten link
Das ist, was der thread entspannen bezeichnet wird, was darauf hindeutet. Meiner Meinung nach ist es wirklich ein Duplikat ist.
Ich verlange, dass 2 Nachkommastellen, %.2g, legt die Gesamtanzahl der Ziffern auf 2, nicht auf die Anzahl der Dezimalstellen.
verwenden Sie "%g" anstelle von "%d", wie dies in dem oben genannten link
Das ist, was der thread entspannen bezeichnet wird, was darauf hindeutet. Meiner Meinung nach ist es wirklich ein Duplikat ist.
Ich verlange, dass 2 Nachkommastellen, %.2g, legt die Gesamtanzahl der Ziffern auf 2, nicht auf die Anzahl der Dezimalstellen.
InformationsquelleAutor integra753 | 2013-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen ist ein problem der Angleichung.
Angenommen, dass der Prozentsatz 19.999. Dann
fractional_part
wäre 99, - und die floating-point-Verzweigung aufgerufen werden.Aber drucken 19.999 mit zwei Nachkommastellen rundet, um 20.00 Uhr, und , dass ist, was gedruckt wird.
Konnten Sie immer die Verwendung der floating-point-Niederlassung, um um konsistente Ergebnisse zu erhalten, und dann truncate'.', wenn es heraus kommt mit '.00'. Andernfalls riskieren Sie, Ihre test-und
printf
's-Interna zu sein-Verschiedenheit einige Zeit.Wenn Sie nicht einverstanden mit
printf
's rounding Strategie, verwenden Sie einfachround()
auf (eine Kopie von)percentage
und Kraft Ihrer eigenen. Oder man könnte auch, z.B.,sprintf()
mit drei Ziffern, und löschen Sie die Dritte.Und in Ihrem speziellen Fall (man beachte, wie sich mein system (Linux-x86_64) macht 0x419FFFFF):
InformationsquelleAutor LSerni
Statt der Berechnung die Nachkommastellen selbst, können Sie versuchen, zu verwenden
ceilf(f) == f
oderfloorf(f) == f
zurücktrue
wennf
ist eine ganze Zahl.Eine alternative wäre auch die Verwendung
modf (float x, float *ipart)
von der std-lib oderfmod
von Mathe -Weder dieser gleich dem ursprünglichen Anteil, so dass mein code führt die floating-Pfad und druckt 20.00%, das ist genau das, was ich versuche zu vermeiden.
InformationsquelleAutor Kris