Std::format gibt die Anzahl der signifikanten Ziffern an, wechselt jedoch niemals zur „e“-NotationC++

Programme in C++. Entwicklerforum
Guest
 Std::format gibt die Anzahl der signifikanten Ziffern an, wechselt jedoch niemals zur „e“-Notation

Post by Guest »

Ich muss Werte mit zwei signifikanten Ziffern formatieren, aber niemals die „e“-Notation verwenden.
Erwartete Ausgabe:

Code: Select all

9.3
6.6
4.6
3.2
2.3
1.6
1.1
760
520
340
200
96
0
123456 sollte als 120000 gedruckt werden. 0,123456 sollte als 0,12 gedruckt werden
Für den Kontext werden SI-Präfixe für jeden Faktor 10^3 verwendet. Versucht

Code: Select all

std::format("{:.2g}", value);
Aber es entscheidet selbst, wann zur „e“-Notation gewechselt wird:

Code: Select all

9.3
6.6
4.6
3.2
2.3
1.6
1.1
7.6e+02
5.2e+02
3.4e+02
2e+02
96
0
Hinweis: Ich frage ausdrücklich nach einer Methode, die keinen Stringstream verwendet.
Hinweis: Die Verwendung des Formatbezeichners f ist falsch. Es werden zwei Nachkommastellen ausgegeben, was nicht korrekt ist:

Code: Select all

9.35
6.56
4.60
3.22
2.26
1.58
1.10
760.33
517.10
339.48
204.91
96.35
0.00
Hier ist ein minimales reproduzierbares Beispiel (mit einer Reihe von Werten)

Code: Select all

#include 
#include 
#include 

static constexpr std::array vals{
9349.3867f,
6558.6953f,
4600.0f,
3224.8362f,
2258.7588f,
1579.2142f,
1099.9999f,
760.32617f,
517.10278f,
339.47632f,
204.91417f,
96.3461f,
0.0f,
-96.346039f,
-204.91402f,
-339.47632f,
-517.10266f,
-760.32574f,
-1099.9999f,
-1579.2134f,
-2258.7578f,
-3224.8362f,
-4599.9985f,
-6558.6938f,
-9349.3867f
};

int main()
{
for(size_t k = 0; k != std::size(vals); ++k)
{
// None of these produce the expected result
puts(std::format("{:.2g}\n", vals[k]).c_str());
puts(std::format("{:.1e}\n", vals[k]).c_str());
puts(std::format("{:.2f}\n", vals[k]).c_str());
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post