Wie erzeugt man in Iostreams ähnliche Formatierungen wie .NET '0. ###%?

8

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)?

    
R. Martinho Fernandes 04.02.2014, 12:16
quelle

2 Antworten

4

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.

    
Jerry Coffin 04.02.2014 17:27
quelle
3

Diese Lösung ist schrecklich.

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:

%Vor%

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.

Hier ist es.

%Vor%

Und hier ist es in Aktion .

    
Bartek Banachewicz 04.02.2014 13:14
quelle

Tags und Links