Aritmetika JavaSripttel - illusztráció és interaktív próba lehetőség

A JavaScript program bemenő adatát és a számítás eredményét egy form objektum segítségével jelenítjük meg. Legyen ez a form a következő: <form name="calculat1">

Az egyenlőség jeltől balra beírható bármely aritmetikai kifejezés, <input type="text" name="A" size="22">
Az egyenlőség jelre kattintva - <input type="button" value=" = " onclick="compute(document.calculat1)"> - az A mezőbe írt kifejezést az általunk megírt compute() JavaScript függvény kiértékeli, majd az eredményt az egyelőség jeltől jobbra eső text tipusú input mezőbe írja, <input type="text" name="result" size="16">. Az erre szolgáló utasítás: form.result.value = eval(form.A.value).

A jobb oldali mezőbe az alábbi konstansok és függvények tesztszőleges kombinációja írható:

Konstansok: PI, LN10
Függvények: pow(x,y), sqrt(x), log(x), round(x), tan(x), sin(x), cos(x).
pow(x,y) megfelel az xy-nak.
A 10-es alapú logaritmus függvényt, lg(x), a következőképpen definiálhatjuk:
function lg(x)
{with (Math)
  r = log(x)/LN10;
return r }
round(x): egy valós számot kerekít a legközelebbi egész számra, a szokásos kerekítéssel.

A számok exponenciális alakban is leírhatók (pl. 0.000011 = 1.1*10-5 helyett 1.1e-5 -t írhatunk). Az e előtti  valós szám 1.0 és 9.9999 közé kell hogy essen, az e után írjuk a 10 hatványkitevőjét. Az 1.1e-5 = 1.1*10-5. Ez az írásmód nagyon nagy vagy nagyon kicsi abszolút értékű  számok megadásakor előnyös, pl. gondoljunk az Avogadro számra.
A szögfüggvények független változóját radiánban kell megadni. 45° szinusza = sin(45/180*PI)

Először nézzünk egy egyszerűbb változatot, amelyben nincs lehetőség kerekítésre. A JavaScript 16 jegyre pontosan számol, de azon túl kisebb valós szám ábrázolási pontatlanságok előfordulhatnak. Pl. érdemes ellenőrizni a sin(PI) eredményét. A pontos eredmény nulla, de a pontatlansága miatt egyes esetekben 1.2246063538223773e-16 a válasz. Ez jó közelítéssel nulla, de az input mezőben csak a szám eleje látható, ami megtévesztő lehet. 

Ezt a problémát egy kerekítésre szolgáló függvény és a hozzátartozó gomb bevezetésével lehet megoldani. További finomítás, hogy ha az input mező üres egy alert ablakban: hibaüzenetet kapunk.

Lássuk függvény magját JavaScript forrás nyelven, amely a C++ nyelv szintaxisát alkalmazza:

{with (Math)
{
    if
(form.A.value == "") alert("A bal oldali mezőt ki kell tölteni!");
else
   { ke = prompt("Hány tizedesre / decimal places", 4);
   form.result.value = round(eval(form.A.value)*pow(10,ke))/pow(10,ke);
}
with (Math): használjuk a matematikai könyvtárat
if
: ha a zárójelbe írt feltétel teljesül, vagyis A üres, akkor kinyílik egy figyelmeztető - alert - ablak, benne a megadott szöveggel.
Ellenkező esetben egy prompt ablak nyílik,
és a megadott ke tizedesjegyekre kerekíti az eredményt, amit a result mezőben megjelenít

Így egy komplett tudományos számológép áll rendelkezésünkre, amely a with(Math) következménye, ha ezt nem írjuk be, akkor csak a négy alapműveletet lehet elvégezni. A feladatot az eval(...) JavaScript függvény végzi el, úgy hogy kiértékeli az argumentumként megadott szöveget, megkeresi benne a számjegyeket, a műveleti jeleket, a függvényeket és a zárójeleket. Ezeket balról jobbra haladva a  precedencia szabályt felhasználva feldolgozza (pl. 3 + 2*5 = 13, itt a szorzást végi el előbb, és csak utána az összeadást).


A html forrásnyelvet, amely működik, módosíthatod az alábbi ablakban: