Jelenlegi hely

9.5. Aritmetika

A Java programozási nyelv támogatja az alapvető aritmetikai számításokat az aritmetikai operátorokkal együtt: +, -, *, /, és %. A java.lang csomagban a Java platform biztosítja a Math osztályt. Ez olyan metódusokat és változókat biztosít, amik segítségével már magasabb rendű matematikai számítások is elvégezhetők, mit például egy szög szinuszának kiszámítása, vagy egy szám bizonyos hatványra emelése.

A Math osztály metódusai osztálymetódusok, tehát közvetlenül az osztály nevével kell őket meghívni, például így:

Math.round(34.87);

A Math osztály metódusai közül elsőként különböző alapvető matematikai függvényeket nézzük meg, mint például egy szám abszolút értékének kiszámítása vagy egy szám kerekítése valamelyik irányban. A következő lista ezeket a metódusokat tartalmazza:

  • double abs(double) float abs(float) int abs(int) long abs(long) A paraméterként kapott paraméter abszolút értékével tér vissza.
  • double ceil(double) A legkisebb double értékkel tér vissza, ami nagyobb vagy egyenlő a paraméterrel, és egyenlő egy egész számmal. (felfelé kerekít)
  • double floor(double) A legnagyobb double értékkel tér vissza, ami kisebb vagy egyenlő a paraméterrel, és azonos egy egész számmal. (lefelé kerekít)
  • double rint(double) A paraméterhez legközelebb álló double értékkel tér vissza, és azonos egy egész számmal. (a legközelebbi egészhez kerekít)
  • long round(double) int round(float) A legközelebbi long vagy int értéket adja vissza, ahogy azt a metódus visszatérési értéke jelzi.

A következő BasicMathDemo program néhány alkalmazási módot illusztrál a fentiekre:

public class BasicMathDemo {
    public static void main(String[] args) {
        double aNumber = -191.635;
        System.out.println("The absolute value of " + aNumber + " is " + Math.abs(aNumber));
        System.out.println("The ceiling of " + aNumber +" is "+ Math.ceil(aNumber));
        System.out.println("The floor of " + aNumber + " is " + Math.floor(aNumber));
        System.out.println("The rint of " + aNumber + " is " + Math.rint(aNumber));
    }
}

A program kimenetei:

The absolute value of -191.635 is 191.635
The ceiling of -191.635 is -191
The floor of -191.635 is -192
The rint of -191.635 is -192

További két alapvető metódus található a Math osztályban. Ezek a min és a max. Az alábbi táblázat mutatja be a min és max metódusok különböző formáit, amik két számot hasonlítanak össze, és a megfelelő típusú értékkel térnek vissza.

  • double min(double, double) float min(float, float) int min(int, int) long min(long, long) A két paraméterből a kisebbel térnek vissza.
  • double max(double, double) float max(float, float) int max(int, int) long max(long, long) A két paraméterből a nagyobbal térnek vissza.

A MinDemo program mutatja be a min alkalmazását két érték közül a kisebb kiszámítására:

public class MinDemo {
    public static void main(String[] args) {
        double enrollmentPrice = 45.875;
        double closingPrice = 54.375;
        System.out.println("A vételár: $" + Math.min(enrollmentPrice, closingPrice));
    }
}

A program valóban az alacsonyabb árat adta vissza:

A vételár: $45.875

A Math osztály következő metódusai a hatványozással kapcsolatosak. Ezen kívül megkaphatjuk az e értékét a Math.E használatával.

  • double exp(double) A szám exponenciális értékével tér vissza.
  • double log(double) A szám természetes alapú logaritmusával tér vissza.
  • double pow(double, double) Az első paramétert a második paraméternek megfelelő hatványra emeli.
  • double sqrt(double) A paraméter négyzetgyökével tér vissza.

A következő ExponentialDemo program kiírja az e értékét, majd meghívja egyenként a fenti táblázatban látható metódusokat egy számra:

public class ExponentialDemo {
    public static void main(String[] args) {
        double x = 11.635;
        double y = 2.76;
        System.out.println("Az e értéke: " + Math.E);
        System.out.println("exp(" + x + ") is " + Math.exp(x));
        System.out.println("log(" + x + ") is " + Math.log(x));
        System.out.println("pow(" + x + ", " + y + ") is " + Math.pow(x, y));
        System.out.println("sqrt(" + x + ") is " + Math.sqrt(x));
    }
}

Az ExponentialDemo kimenete:

Az e értéke: 2.71828
exp(11.635) is 112984
log(11.635) is 2.45402
pow(11.635, 2.76) is 874.008
sqrt(11.635) is 3.41101

A Math osztály egy sor trigonometrikus függvényt is kínál, ezek a következő táblázatban vannak összefoglalva. A metóduson áthaladó szögek radiánban értendők. Radiánból fokká, és onnan visszakonvertálásra két függvény áll rendelkezésünkre: toDegrees és toRadians. Előbbi fokká, utóbbi radiánná konvertál. A Math.PI függvény meghívásával a PI értékét kapjuk meg a lehető legpontosabban.

  • double sin(double) Egy double szám szinuszával tér vissza.
  • double cos(double) Egy double szám koszinuszával tér vissza.
  • double tan(double) Egy double szám tangensével tér vissza.
  • double asin(double) Egy double szám arc szinuszával tér vissza.
  • double acos(double) Egy double szám arc koszinuszával tér vissza.
  • double atan(double) Egy double szám arc tangensével tér vissza.
  • double atan2(double) Derékszögű koordinátákat konvertál (b, a) polárissá (r, théta).
  • double toDegrees(double) double toRadians(double) A paramétert radiánná vagy fokká konvertálják, a függvények adják magukat.

A következő TrigonometricDemo program használja a fenti táblázatban bemutatott összes metódust, hogy különböző trigonometrikus értékeket számoljon ki a 45 fokos szögre:

public class TrigonometricDemo {
    public static void main(String[] args) {
        double degrees = 45.0;
        double radians = Math.toRadians(degrees);
        System.out.println("The value of pi is " + Math.PI);
        System.out.println("The sine of " + degrees + " is " + Math.sin(radians));
        System.out.println("The cosine of " + degrees + " is " + Math.cos(radians));
        System.out.println("The tangent of " + degrees + " is " + Math.tan(radians));
    }
}

A program kimenetei:

The value of pi is 3.141592653589793
The sine of 45.0 is 0.8060754911159176
The cosine of 45.0 is -0.5918127259718502
The tangent of 45.0 is -1.3620448762608377

Megjegyezzük, hogy a NaN akkor jelenik meg, amikor az eredmény matematikailag nem definiált. A Double és a Float osztályok is tartalmazzák a NaN konstanst. Összehasonlítva a visszatérési értéket az egyik ilyen konstanssal, a programunk el tudja dönteni, hogy a visszaadott érték érvényes-e. Ilyen módon a programunk elfogadhatóan tud reagálni, ha egy metódus nem definiált értéket kap.
Az utolsó Math metódus, amiről szót ejtünk, a random. A metódus egy kvázi-véletlen 0.0 és 1.0 közé eső számmal tér vissza. Pontosabban leírva:

0.0 ≤ Math.random() < 1.0

Hogy más intervallumban kapjunk meg számokat, műveleteket hajthatunk végre a függvény által visszaadott értéken. Például, ha egy egész számot szeretnénk kapni 1 és 10 között, akkor a következőt kell begépelnünk:

int number = (int)(Math.random() * 10 + 1);

Megszorozva ezt az értéket 10-el a lehetséges értékek intervalluma megváltozik:

0.0 ≤ szám < 10.0.

1-et hozzáadva az intervallum ismét megváltozik:

1.0 ≤ szám < 11.0.

Végül, az érték egésszé konvertálásával egy konkrét számot (int) kapunk 1 és 10 között.

A Math.random használata tökéletes, ha egy egyszerű számot kell generálni. Ha egy véletlen számsorozatot kell generálni, akkor egy hivatkozást kell létrehozni a java.util.Random–ra, és meghívni ennek az objektumnak a különböző metódusait.