by Guest » 13 Jan 2025, 10:13
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
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());
}
}
Ich muss Werte mit zwei signifikanten Ziffern formatieren, aber niemals die „e“-Notation verwenden.
Erwartete Ausgabe:
[code]9.3
6.6
4.6
3.2
2.3
1.6
1.1
760
520
340
200
96
0
[/code]
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]std::format("{:.2g}", value);
[/code]
Aber es entscheidet selbst, wann zur „e“-Notation gewechselt wird:
[code]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
[/code]
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]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
[/code]
Hier ist ein minimales reproduzierbares Beispiel (mit einer Reihe von Werten)
[code]#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());
}
}
[/code]