Zwei Dezimalstellen mit printf ()

71

Ich versuche, eine Zahl mit zwei Dezimalstellen printf()wie folgt zu schreiben :

#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, erhalte 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.

chux - Monica wieder einsetzen
quelle
2
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 zusätzliche 2 vor dem Float stehen.
1
@nvm: Die Nullen werden angezeigt, weil 94.9456 als Doppel (8 Byte) auf den Stapel geschoben wurde und% d die ersten 4 Bytes als Ganzzahl verarbeitete und die nächsten 4 Bytes Nullen waren und der Code diese 4 nachfolgenden gelesen hat Bytes von der ersten Zahl plus die führenden 4 Bytes des zweiten Floats und versuchten, es 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
Scheint, dass das Setzen einer Ganzzahl vor "f" wie "% 10f" keine Auswirkung hat, da es so ist, als würde man "% f" schreiben? Ich habe das versucht und nur das Ergebnis erhalten, als ob es "% f" wäre.

Antworten:

141

Was Sie wollen, ist %.2fnicht 2%f.

Vielleicht möchten Sie auch Ihre %ddurch a ersetzen %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 Folgendes ausgeben:

Wenn diese Nummer: 94.945600 2 dp zugewiesen ist, lautet sie: 94.95

Eine vollständige Beschreibung der Formatierungsoptionen für printf finden Sie hier: printf

Dachsr
quelle
6

Verwenden Sie: "%.2f"oder Variationen davon.

In der POSIX- Spezifikation finden Sie eine maßgebliche Spezifikation der printf()Formatzeichenfolgen. Beachten Sie, dass POSIX-Extras von der C99-Kernspezifikation getrennt werden. Es gibt einige C ++ - Websites, die in einer Google-Suche angezeigt werden, aber einige haben zumindest einen zweifelhaften Ruf, gemessen an den Kommentaren, die an anderer Stelle auf SO zu sehen sind.

Da Sie in C ++ codieren, sollten Sie dies wahrscheinlich vermeiden printf() und seine Verwandten .

Jonathan Leffler
quelle
-3

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, cast it to double einzugeben, bevor Sie es mit% f wie folgt drucken:

printf("The number with fake decimal point is %0.2f", (double)(iAmount)/100);

Meine 2 Cent :)

Mike Maske
quelle
Dies ist ein Versuch, versuche es nicht.
Oussama Ben Ghorbel