Dodwin: Auf nächste Dezimalstelle runden

Hallo,

Ich suche eine Möglichkeit eine Zahl auf die nächstgrößere Dezimalstelle zu runden.

Beispiele:
 0.03 =>   0.1
 0.1  =>   0.1
 0.5  =>   1
 4    =>  10
10    =>  10
12    => 100
23    => 100

Ich hoffe das System ist zu erkennen.

Meine bisherige Idee ist die Zahl in einen String zu zerlegen und dann die Stellen zu durchlaufen und bei (stelle != 0) die vorherige Stelle auf 1 zu setzen.
Dann gäbe es 2 Ausnahmen. Eine wäre, wenn die Stelle ein Komma ist. Die andere Ausnahme wäre, wenn die Stelle die letzte im String ist oder wenn alle Folgestellen gleich 0 sind (denn 0.1 => 0.1 und 10 => 10).

Die Frage ist, sieht da irgendjemand eine Idee für einen (mehr oder weniger) mathematischen Ansatz?
Ich werd das in JavaScript umsetzen, es geht mir allerdings im Moment nur um die Idee zum Algorithmus.

Gruß,
Dodwin

--
Dodwin
  1. Denk mal in die Richtung dass du praktisch das Komma verschiebst (also aus 0.03 wird 0.3, aus 4 wird 0.4 usw), dann mit ceil arbeitest und dann das Komma wieder zurück verschiebst.

  2. @@Dodwin:

    nuqneH

    Ich suche eine Möglichkeit eine Zahl auf die nächstgrößere Dezimalstelle zu runden.

    Nein, du möchtest nicht runden.

    0.03 =>   0.1

    Beim Runden käme da nicht 0.1 heraus, sondern 0.

    Was du möchtest, ist die nächstgrößere (oder gleiche) Zehnerpotenz zu finden.

    Das erreichst du mit dem Zehnerlogarithmus*:
    lg 0.03 = -1.52…

    Dazu suchst du dir die nächstgrößere (oder gleiche) ganze Zahl: ceil(-1.52) = -1

    10⁻¹ = 0.1 ist deine geuchte Zehnerpotenz.

    Allgemein: return Math.pow(10, Math.ceil(Math.log(x) * Math.LOG10E));

    Qapla'

    * zur Erinnerung:
    [latex]\lg x = \frac{\ln x}{\ln 10} = \ln x \lg \mathrm e[/latex]

    --
    Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    1. @@Gunnar Bittersmann:

      nuqneH

      Allgemein: return Math.pow(10, Math.ceil(Math.log(x) * Math.LOG10E));

      Wobei ich mir nicht sicher bin, ob das nicht Rechenungenauigkeiten[1] liefern könnte.

      Evtl. ist man mit return parseFloat("1E" + Math.ceil(Math.log(x) * Math.LOG10E)); besser dran.

      Qapla'

      [1] FAQ: Wieso habe ich beim Rechnen mit Dezimalzahlen Rechenfehler?

      --
      Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    2. Hallo Gunnar,

      Das erreichst du mit dem Zehnerlogarithmus*:
      lg 0.03 = -1.52…

      Oh Mann... Da wäre ich wohl nie drauf gekommen.

      10⁻¹ = 0.1 ist deine geuchte Zehnerpotenz.
      Allgemein: return Math.pow(10, Math.ceil(Math.log(x) * Math.LOG10E));

      Perfekt. Funktioniert super.

      Danke,
      Dodwin

      --
      Dodwin