Ich möchte eine Gleitkommazahl als Prozentsatz ausgeben, mit bis zu drei Dezimalstellen.
Ich weiß, dass Iostreams drei verschiedene Arten haben, Floats zu präsentieren:
"Standard", der entweder die Regeln von fixed
oder scientific
anzeigt, abhängig von der Anzahl der gewünschten signifikanten Ziffern, wie in setprecision
definiert;
fixed
, das eine feste Anzahl von Dezimalstellen anzeigt, die durch setprecision
definiert sind; und
scientific
, das eine feste Anzahl von Dezimalstellen anzeigt, aber wissenschaftliche Notation verwendet, d. h. Mantisse + Exponent der Radix.
Diese drei Modi können effektiv mit diesem Code angezeigt werden:
%Vor%Keine dieser Optionen befriedigt mich.
Ich möchte hier jede wissenschaftliche Notation vermeiden, da es die Prozentsätze wirklich schwer lesbar macht. Ich möchte höchstens drei Dezimalstellen behalten, und es ist in Ordnung, wenn sehr kleine Werte als Null angezeigt werden. Ich möchte aber auch nachgestellte Nullen in Teilbereichen für Fälle wie 0,95 oben vermeiden: Ich möchte, dass das in der zweiten Zeile als "95%" angezeigt wird.
In .NET kann ich dies mit einer benutzerdefinierten Formatzeichenfolge wie "0. ###%" erreichen, die mir eine Zahl gibt, die als Prozentsatz mit mindestens einer Ziffer links vom Dezimaltrennzeichen formatiert ist, und bis zu drei Ziffern rechts vom Dezimaltrennzeichen, nachgestellte Nullen übersprungen: Ссылка
Kann ich dies mit Iostreams erreichen, ohne meine eigene Formatierungslogik zu schreiben (z. B. Spezialgehäuse mit kleinen Zahlen)?
Ich bin mir ziemlich sicher, dass nichts, was in Iostreams eingebaut ist, dies direkt unterstützt.
Ich denke, der sauberste Weg, damit umzugehen, besteht darin, die Zahl zu runden, bevor man sie an einen Iostream weitergibt, um ausgedruckt zu werden:
%Vor% Aufgrund der Art und Weise, wie es abgerundet wird, hat dies eine Begrenzung für die Anzahl der Zahlen, mit denen es arbeiten kann. Für Prozentsätze ist das wahrscheinlich kein Problem, aber wenn Sie mit einer Zahl arbeiten, die nahe der größten ist, die im betreffenden Typ dargestellt werden kann ( double
in diesem Fall), die Multiplikation mit pow(10, places)
könnte / würde überlaufen und schlechte Ergebnisse produzieren.
Obwohl ich nicht absolut sicher sein kann, scheint es nicht so, als würde dies ein Problem für das Problem verursachen, das Sie anscheinend lösen wollen.
Ich meine es ernst. Ich mag es nicht. Es ist wahrscheinlich langsam und die Funktion hat einen blöden Namen. Vielleicht kannst du es für die Testüberprüfung verwenden, weil es so dumm ist, dass du leicht sehen kannst, dass es funktioniert.
Es wird auch angenommen, dass das Dezimaltrennzeichen '.'
ist, was nicht der Fall sein muss. Der richtige Punkt könnte erhalten werden durch:
Aber das löst das Problem immer noch nicht, weil die Zeichen, die für Ziffern verwendet werden, anders sein können und im Allgemeinen sollte das nicht so geschrieben werden.
Und hier ist es in Aktion .