Coding-Schatzkästlein
Kleine Tips & Scripts zum Webdesign
Start > JavaScript > Number-Library

JavaScript: Zahlenallerlei "Number-Library"
(Zufallszahl, Runden, Formatieren & mehr)

Zusammenfassung

Name:  Number-Library
Aufgabe:  Stellt Funktionen rund um Zahlen zur Verfügung.
Benötigt:  JavaScript 1.0
Beispiel:  -
Download:  numlib.js

Diese Bibliothek faßt häufiger gebrauchte Funktionen rund um Zahlen zu einer Einheit zusammen. Im einzelnen sind dies momentan:

Runden auf beliebige Stellen
Erzeugung einer ganzen Zufallszahl
Ermittlung des Nachkommaanteils (ohne die JavaScript-typischen Rundungsabweichungen)
Formatierte Ausgabe von Dezimalzahlen
Formatierte Umwandlung in andere Zahlensysteme


Runden auf beliebige Stellen
dezRound(num[,pos])

Mit der JavaScript-Methode Math.round() kann man Zahlen einfach auf-, bzw. abrunden. Mit der hier vorgestellten Funktion dezRound() geschieht dies auch auf beliebige Stellen. Dabei wird mit dem optionalen Parameter pos die Stelle angegeben, ab der gerundet werden soll (pos<0 für Stellen vor, pos>0 für Stellen hinter dem Komma).

Beispiele:
dezRound(5.345847) ergibt 5
dezRound(53.45847,2) ergibt 53.46
dezRound(53458.47,-2) ergibt 53500


Erzeugung einer ganzen Zufallszahl
rnd(max)
rand(min,max)

Die JavaScript-Methode Math.random() erzeugt eine zufällige Fließkommazahl zwischen 0 und 1. Die hier vorgestellten Funktionen rnd(max) und rand(min,max) erzeugen hingegen eine Integerzahl (es wird also eine ganze Zahl generiert), wobei die größtmögliche Zufallszahl durch den Parameter max definiert wird. Die kleinstmögliche Zufallszahl ist bei rnd(max) die 1, bei rand(min,max) wird sie durch den Parameter min definiert.

Beispiele:
rnd(3) erzeugt eine natürliche Zahl zwischen 1 und 3 (inkl.), also 1, 2 oder 3
rand(-1,2) erzeugt eine ganze Zahl zwischen -1 und 2 (inkl.), also -1, 0, 1 oder 2


Wie ermittelt man in JavaScript den Nachkommaanteil einer realen Zahl? Ganz einfach: Man zieht von der Zahl den Vorkommaanteil ab und hat ihn.
Allerdings arbeitet JavaScript mit Zahl-parseInt(Zahl) ungenau, bzw. eigentlich "zu genau". ;) Denn leider erfolgen Ausgabe und (interne) Berechnung mit unterschiedlichen Genauigkeiten, so daß es zu Rundungsabweichungen kommen kann, die sich insbesondere dann negativ auswirken können, wenn man die Ergebnisse wechselweise zur Darstellung und Rechnung nutzt, bzw. sie zwischenzeitlich in eine Zeichenkette umwandelt.

Beispiel:
getFrac(314.1592653589793) ergibt 0.1592653589793

Rechenungenauigkeiten bei Fließkommazahlen lassen sich halt im binär rechnenden Computer ggf. nicht vermeiden. Das ist natürlich auch bei JavaScript so, und ist auch in der JavaScript-FAQ nachzulesen. Interessierten sei diesbezüglich auch der Artikel Zahlendarstellung in Programmen und numerische Probleme nahegelegt. Insbesondere der dortige Merksatz: "Zahlen im Gleitkommaformat (float,double,...) nie auf Gleichheit prüfen! Statt dessen Prüfung auf > oder < oder E-Bereich."


Formatierte Ausgabe von Dezimalzahlen
dezInt(num[,size[,prefix]]) & dezFrac(num[,size[,postfix]])
dez(num[,intsize[,fracSize[,prefix[,postfix[,fracSign]]]]])

JavaScript hat bei der Behandlung von Dezimalzahlen zwei Eigenschaften, die mitunter recht störend sein können:

  1. Bei führenden Nullen interpretiert JavaScript die Zahl als Oktalzahl (d.h., die dezimale Zahl 00010 wird nicht als dezimale 10 sondern als dezimale 8 interpretiert)
  2. Abschließende Nullen im Nachkommabereich werden abgeschnitten (aus 3.00 wird immer 3)

Beides kann man umgehen, indem die Zahlen mit den hier vorgestellten Funktionen in eine Zeichenkette umgewandelt werden. Dies sind für

  • den Integerbereich dezInt(num,size,prefix), wobei der Parameter
    • num die zu bearbeitende Zahl,
    • size die gewünschte Anzahl der Mindestsstellen, und
    • prefix das Auffüllzeichen ist (voreingestellt: 0);
  • den Fließkommabereich dezFrac(num,size,postfix), wobei der Parameter
    • num die zu bearbeitende Zahl,
    • size die gewünschte Anzahl der Mindestsstellen, und
    • postfix das Auffüllzeichen ist (voreingestellt: 0);
  • reale Zahlen dez(num,intSize,fracSize,prefix,postfix,fracSign), wobei der Parameter
    • num die zu bearbeitende Zahl,
    • intSize die gewünschte Anzahl der (Vorkomma-)Mindestsstellen,
    • fracSize die gewünschte Anzahl der (Nachkomma-)Mindestsstellen,
    • prefix das (Vorkomma-)Auffüllzeichen (voreingestellt: 0),
    • postfix das (Nachkomma-)Auffüllzeichen (voreingestellt: 0), und
    • fracSign das gewünschte Dezimaltrennzeichen ist (voreingestellt: Dezimalpunkt).
Beispiele:
dezInt(3,2) ergibt "03"
dezInt(3.1,2) ergibt "03"
dezInt(300,2) ergibt "300"
dezInt(3,4,"+") ergibt "+++3"
dezFrac(3,2) ergibt "00"
dezFrac(3.1,2) ergibt "10"
dezFrac(3.001,2) ergibt "001"
dezFrac(3.1,4,"+") ergibt "1+++"
dez(3,2,4) ergibt "03.0000"
dez(-3.1,2,4) ergibt "-03.1000"
dez(300.001,2,2) ergibt "300.001"
dez(-3.1,4,4,"#","+",",") ergibt "###-3,1+++"
dez(3.1,0,2,"","0",",") ergibt "3,10"
dez("0010.0100") ergibt "10.01"

Achtung: Bei negativen Zahlen erscheint das Minus-Zeichen vor den ggf. führenden Nullen. Sind jedoch andere Zeichen als führende Nullen gewünscht (z.B. Leerzeichen), so erscheint das Minus-Zeichen hinter den führenden Zeichen (also direkt vor der eigentlichen Zahl)!


Formatierte Umwandlung in andere Zahlensysteme
stringInt(num[,base[,size]])

Mit der JavaScript-Methode parseInt() kann man nicht nur eine in einem String enthaltene Dezimalzahl in einen numerischen Wert umwandeln (um dann mit ihm zu rechnen), auch Hexadezimal-, Oktal- und Binärzahlen können über den optionalen Parameter der Basis in Dezimalzahlen umgewandelt werden.
Die hier vorgestellte Funktion stringInt() ist die Umkehrfunktion dazu (ähnlich der JavaScript-Methode toString(), die allerdings erst ab JavaScript 1.1 verfügbar ist). D.h., aus einer Zahl kann ein String mit diesem Wert erzeugt werden - ebenfalls mit einer optionalen Basis, mit der man in eines der genannten Zahlensysteme umwandeln kann (wird keine Basis angegeben, so wird das Dezimalsystem als Basis verwendet). Im Unterschied zu toString() kann man jedoch (optional) noch die Anzahl der Stellen angeben, die mindestens angezeigt werden sollen. Das Ergebnis wird linksbündig ggf. mit Nullen aufgefüllt

Beispiele:
stringInt(10) ergibt "10" (dezimal -> Dezimalzahl)
stringInt(10,16) ergibt "A" (dezimal -> Hexadezimalzahl)
stringInt(255,16,4) ergibt "00FF" (dezimal -> vierstellige Hexadezimalzahl)
stringInt(010,10)) ergibt "8" (oktal -> Dezimalzahl)
stringInt(8,8) ergibt "10" (dezimal -> Oktalzahl)
stringInt(5,2,8) ergibt "00000101" (dezimal -> achtstellige Binärzahl)


Die externe Bibliothek: numlib.js

Updates:
10.01.2004: 
Neue Funktion: rand() (Zufallszahl).


Kurz-URL dieses Artikels: http://Coding.binon.net/NumLib