Coding-Schatzkästlein
| |||||||||||||||||||||||||||||||
| Zusammenfassung | ||||
|---|---|---|---|---|
| Name: |
Number- | |||
| 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:
dezRound(num[,pos])
Mit der JavaScript-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).
dezRound(5.345847) ergibt 5dezRound(53.45847,2) ergibt 53.46dezRound(53458.47,-2) ergibt 53500
rnd(max)rand(min,max)
Die JavaScript-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.
rnd(3) erzeugt eine natürliche Zahl zwischen 1 und 3 (inkl.), also 1, 2 oder 3rand(-1,2) erzeugt eine ganze Zahl zwischen -1 und 2 (inkl.), also -1, 0, 1 oder 2getFrac(num)
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.
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-
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:
00010 wird nicht als dezimale 10 sondern als dezimale 8 interpretiert)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
dezInt (num, size, prefix), wobei der Parameternum die zu bearbeitende Zahl,size die gewünschte Anzahl der Mindestsstellen, undprefix das Auffüllzeichen ist (voreingestellt: 0);dezFrac (num, size, postfix), wobei der Parameternum die zu bearbeitende Zahl,size die gewünschte Anzahl der Mindestsstellen, undpostfix das Auffüllzeichen ist (voreingestellt: 0);dez (num, intSize, fracSize, prefix, postfix, fracSign), wobei der Parameternum die zu bearbeitende Zahl,intSize die gewünschte Anzahl der (Vorkomma-)fracSize die gewünschte Anzahl der (Nachkomma-)prefix das (Vorkomma-)0),postfix das (Nachkomma-)0), undfracSign das gewünschte Dezimaltrennzeichen ist (voreingestellt: Dezimalpunkt).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-
stringInt(num[,base[,size]])
Mit der JavaScript-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-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
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)
|
Updates: | |
|---|---|
|
10.01.2004: |
Neue Funktion: rand() (Zufallszahl).
|