yalu wrote:
> Aus den genannten Gründen würde ich das i als double deklarieren. Aber
> auch dann hast du natürlich immer noch das Problem, dass das gerundete
> Ergebnis (z. B. 1.234) intern nicht immer exakt darstellbar ist und
> durchaus auch 1.233999 oder 1.234001 sein kann.
Um das weiterzuführen:
Das ist aber kein Problem. Da macht man eine Rundungskorrektur
dran und fertig:
i = (int)( pow(10, Stellen) + 0.5);
Aber ganz was anderes in diesem Zusammenhang.
pow() ist eine teure Funktion!
Und jetzt stell ich mal die Frage, was denn übliche Werte für
Stellen sein könnten. Ich wage mal die Behauptung, dass ausser
den Werten 0, 1, 2, 3, 4, 5, 6 praktisch keine anderen Werte
vorkommen werden.
Ergo würde ich das ganze komplett ohne pow machen und stattdessen
eine Tabelle nehmen (und Stellen als int ausführen. Du kannst keine
2.5 Nachkommastellen haben. unsigned int wäre noch besser, aus
praktischen Gründen belasse ich es aber bei int).
1 | long Faktoren[] = { 1, 10, 100, 1000, 10000, 100000, 10000000 };
|
2 |
|
3 | double Round(double Zahl, int Stellen)
|
4 | {
|
5 | if( Stellen >= sizeof( Faktoren ) / sizeof( *Faktoren ) )
|
6 | Stellen = sizeof( Faktoren ) / sizeof( *Faktoren ) - 1;
|
7 | if( Stellen < 0 )
|
8 | Stellen = 0;
|
9 |
|
10 | long i = Faktoren[Stellen];
|
11 |
|
12 | ...
|
Das dürfte
* um einiges schneller sein
* wenn pow() sonst nirgends im Pgm gebraucht wird auch um
einiges platzsparender sein.
Allerdings:
Es löst nicht das ursprüngliche Problem, zu dem ich auch keine
Idee habe was da schiefgelaufen sein könnte.