Formatierung n signifikanter Stellen in C ++ ohne wissenschaftliche Notation

8

Ich möchte einen Gleitkommawert auf n signifikante Ziffern formatieren, aber niemals wissenschaftliche Notation verwenden (auch wenn sie kürzer wäre).

Die Formatangabe %f behandelt keine signifikanten Ziffern, und %g liefert mir manchmal eine wissenschaftliche Notation (was für meine Verwendung nicht geeignet ist).

Ich möchte Werte in der Form "123", "12.3", "1.23" or "0.000000123" .

Gibt es einen eleganten Weg dies mit C ++ oder boost zu tun?

    
PeteC 20.06.2013, 10:19
quelle

3 Antworten

11

Der beste Weg, den ich kenne (und in meinem eigenen Code verwende) ist

%Vor%

c ++ 11 hat std :: round, so dass Sie meine Version nicht mit einem neuen Compiler benötigen.

Der Trick, den ich hier ausnutze, besteht darin, die gewünschte Genauigkeit zu erhalten, indem ich das Logbuch der Basis 10 nehme, um die Anzahl der Stellen vor der Dezimalzahl zu zählen und diese von der gewünschten Genauigkeit zu subtrahieren.

Er erfüllt auch die Anforderungen von @Mats Petersson und wird in allen Fällen funktionieren.

Das Bit, das ich nicht mag, ist die anfängliche Überprüfung auf Null (so dass die Log-Funktion nicht explodiert). Verbesserungsvorschläge / direkte Bearbeitung dieser Antwort erwünscht.

    
Bathsheba 20.06.2013, 10:44
quelle
0

std::fixed und std::setprecision (und <iomanip> im Allgemeinen) sind deine Freunde.

%Vor%

druckt 1.23e-07 und

%Vor%

druckt 0.000000123000000

Denken Sie daran, dass Fließkommazahlen eine begrenzte Genauigkeit haben, also

%Vor%

druckt 123456789012345677877719597056.000000 (wahrscheinlich nicht das, was Sie wollen)

    
Massa 20.06.2013 10:25
quelle
0

Ich denke, du musst nachfolgende Nullen selbst entfernen:

%Vor%

Verwendung:

%Vor%

Zusammengefügt:

%Vor%

Verwendung:

%Vor%

Wenn jemand einen besseren Weg kennt ...

    
Gauthier Boaglio 20.06.2013 10:45
quelle