Ich versuche, eine Zahl mit zwei Dezimalstellen zu schreiben printf() folgendermaßen:
#include <cstdio>
int main()
{
printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456);
return 0;
}
Wenn ich das Programm starte, bekomme ich folgende Ausgabe:
# ./printf
When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000
Warum ist das so?
Vielen Dank.
Der Teil -1234 … ist die Darstellung Ihres 32-Bit-Gleitkommas als Ganzzahl. Der zweite Teil ist falsch, Sie sollten %2.2f haben, aber ich kann den Teil -0.0000… immer noch nicht erklären. Ich für meinen Teil erhalte ein korrektes Ergebnis, außer dass beim Ausführen Ihres Codes eine zusätzliche 2 vor dem Float steht.
– Benutzer173973
24. Januar 2011 um 16:30 Uhr
@nvm: Die Nullen werden angezeigt, weil 94,9456 als Double (8 Bytes) auf den Stapel geschoben wurde und %d die ersten 4 Bytes als Ganzzahl verarbeitet hat und die nächsten 4 Bytes Nullen waren und der Code dann diese 4 nachgestellten gelesen hat Bytes von der ersten Zahl plus die führenden 4 Bytes der zweiten Gleitkommazahl und versucht, sie als Double zu behandeln. Die Antwort war so klein, dass das Festkommaformat sie als Null behandelt. Und dies wurde auf einem Intel-Chip ausgeführt, nicht auf einer RISC-Maschine.
– Jonathan Leffler
24. Januar 2011 um 17:01 Uhr
Scheint, dass das Setzen einer Ganzzahl vor “f” wie “%10f” keine Wirkung hat, da es genauso ist, als würde man “%f” schreiben? Ich habe das versucht und bekomme nur das Ergebnis, als ob es “% f” wäre.
– aali
24. Januar 2011 um 17:13 Uhr
Dachs
Was Sie wollen, ist %.2fnicht 2%f.
Außerdem möchten Sie vielleicht Ihre ersetzen %d mit einer %f 😉
#include <cstdio>
int main()
{
printf("When this number: %f is assigned to 2 dp, it will be: %.2f ", 94.9456, 94.9456);
return 0;
}
Dies wird ausgeben:
Wenn diese Nummer: 94.945600 2 dp zugewiesen wird, lautet sie: 94.95
Hier finden Sie eine vollständige Beschreibung der printf-Formatierungsoptionen: printf
Verwenden: "%.2f" oder Variationen davon.
Siehe die Posix spec für eine maßgebliche Spezifikation der printf() Zeichenfolgen formatieren. Beachten Sie, dass es die POSIX-Extras von der C99-Kernspezifikation trennt. Es gibt einige C++-Sites, die in einer Google-Suche auftauchen, aber einige haben zumindest einen zweifelhaften Ruf, wenn man die Kommentare an anderer Stelle auf SO betrachtet.
Da Sie in C++ programmieren, sollten Sie dies wahrscheinlich vermeiden printf() und seine Angehörigen.
Rozuur
Zum %d Teil beziehen sich auf diesen Wie funktioniert dieses Programm? und für Dezimalstellen verwenden %.2f
Versuchen Sie es mit einem Format wie %d.%02d
int iAmount = 10050;
printf("The number with fake decimal point is %d.%02d", iAmount/100, iAmount%100);
Ein anderer Ansatz besteht darin, es zu verdoppeln, bevor es mit %f wie folgt gedruckt wird:
printf("The number with fake decimal point is %0.2f", (double)(iAmount)/100);
Meine 2 Cent 🙂
14195100cookie-checkZwei Dezimalstellen mit printf()yes
Der Teil -1234 … ist die Darstellung Ihres 32-Bit-Gleitkommas als Ganzzahl. Der zweite Teil ist falsch, Sie sollten %2.2f haben, aber ich kann den Teil -0.0000… immer noch nicht erklären. Ich für meinen Teil erhalte ein korrektes Ergebnis, außer dass beim Ausführen Ihres Codes eine zusätzliche 2 vor dem Float steht.
– Benutzer173973
24. Januar 2011 um 16:30 Uhr
@nvm: Die Nullen werden angezeigt, weil 94,9456 als Double (8 Bytes) auf den Stapel geschoben wurde und %d die ersten 4 Bytes als Ganzzahl verarbeitet hat und die nächsten 4 Bytes Nullen waren und der Code dann diese 4 nachgestellten gelesen hat Bytes von der ersten Zahl plus die führenden 4 Bytes der zweiten Gleitkommazahl und versucht, sie als Double zu behandeln. Die Antwort war so klein, dass das Festkommaformat sie als Null behandelt. Und dies wurde auf einem Intel-Chip ausgeführt, nicht auf einer RISC-Maschine.
– Jonathan Leffler
24. Januar 2011 um 17:01 Uhr
Scheint, dass das Setzen einer Ganzzahl vor “f” wie “%10f” keine Wirkung hat, da es genauso ist, als würde man “%f” schreiben? Ich habe das versucht und bekomme nur das Ergebnis, als ob es “% f” wäre.
– aali
24. Januar 2011 um 17:13 Uhr