9. Matematiikka

Jakojäännös

Jakojäännös tarkoittaa jakolaskussa yli jäävää kokonaislukua. Esimerkiksi jos luku 17 jaetaan luvulla 5, jakojäännös on 2, koska 3 · 5 = 15, mutta 2 jää yli.

Javassa jakojäännös lasketaan %-merkillä. Esimerkiksi seuraava ohjelma tulostaa luvun 2:

System.out.println(17 % 5);

Jakojäännöksellä on paljon sovelluksia ohjelmoinnissa. Ensinnäkin jakojäännöksen avulla voi tarkistaa luvun jaollisuuden jollain luvulla. Esimerkiksi jos täytyy selvittää, onko luku parillinen, riittää tarkistaa, onko luvun jakojäännös 2:lla 0:

System.out.print("Anna luku: ");
int luku = Integer.parseInt(input.nextLine());

if (luku % 2 == 0) {
    System.out.println("Luku on parillinen.");
} else {
    System.out.println("Luku on pariton.");
}

Myöhemmin kurssilla tulee vastaan muita jakojäännöksen sovelluksia.

Math-kirjasto

Javan osana on kirjasto Math, jossa on matematiikkaan liittyviä funktioita. Kirjastoon kuuluvat mm. seuraavat funktiot:

funktioselitys
Math.abs(x)itseisarvo
Math.min(x, y)pienempi luvuista x ja y
Math.max(x, y)suurempi luvuista x ja y
Math.pow(x, y)potenssilasku: xy
Math.sqrt(x)neliöjuuri

Seuraava ohjelma laskee luvun neliöjuuren:

System.out.print("Anna luku: ");
int luku = Integer.parseInt(input.nextLine());

System.out.println("Neliöjuuri: " + Math.sqrt(luku));

Satunnaisluvut

Satunnaislukugeneraattori tuottaa satunnaisia lukuja. Seuraava komento luo satunnaislukugeneraattorin:

Random arpoja = new Random();

Tämän jälkeen generaattorilta voi pyytää satunnaisia kokonaislukuja komennolla nextInt. Komennolle annetaan yläraja, ja sen tuottamat luvut ovat väliltä 0...yläraja-1.

Seuraava ohjelma arpoo satunnaisen luvun väliltä 0–9:

Random arpoja = new Random();
int luku = arpoja.nextInt(10);
System.out.println("Satunnainen luku: " + luku);

Ohjelman tulostuksia ovat esimerkiksi seuraavat:

Satunnainen luku: 3
Satunnainen luku: 7

Javan satunnaislukugeneraattorista puuttuu komento, jolla voisi hakea satunnaisen luvun kahden kokonaisluvun väliltä, koska alaraja 0 on kiinteä. Tämä ei ole kuitenkaan suuri ongelma, koska jos haluamme luvun väliltä a...b, voimme myös hakea luvun väliltä 0...(b - a) ja lisätä tulokseen a.

Seuraava esimerkki toteuttaa yllä olevan idean:

System.out.print("Anna alaraja: ");
int alaraja = Integer.parseInt(input.nextLine());
System.out.print("Anna yläraja: ");
int ylaraja = Integer.parseInt(input.nextLine());

Random arpoja = new Random();
int luku = arpoja.nextInt(ylaraja - alaraja + 1) + alaraja;
System.out.println("Satunnainen luku: " + luku);

Ohjelman suoritus voi olla seuraava:

Anna alaraja: 57
Anna yläraja: 65
Satunnainen luku: 63

Lukuarvot

Javan tyypit int ja double tuntuvat päältä päin melko samanlaisilta, mutta niiden käytössä on silti tärkeitä eroja.

Tyyppi int tallentaa kokonaisluvun tarkasti, mutta sen lukualue on melko rajattu: pienin mahdollinen int-luku on -2147483648 ja suurin mahdollinen int-luku on 2147483647.

Seuraavan ohjelman toiminta on yllättävä:

int luku = 2147483647;
luku = luku + 1;
System.out.println(luku);

Ohjelma tulostaa luvun -2147483648. Tässä int-muuttujaan yritettiin laittaa liian suuri luku, jolloin luvun arvo pyörähti ympäri negatiiviselle puolelle pienimpään mahdolliseen lukuun.

Suurempia kokonaislukuja varten Javassa on tyypit long ja BigInteger, joita ei kuitenkaan käsitellä tällä kurssilla.

Tyyppi double voi sisältää desimaaliluvun ja sen lukualue on suuri, mutta tyypin rajoituksena on, että monen luvun arvoa ei voida tallentaa tarkasti vaan arvo joudutaan pyöristämään. Niinpä double-tyyppiä käyttäessä harmina ovat mahdolliset pyöristysvirheet.

Seuraava ohjelma saa aikaan pyöristysvirheen:

double luku = 0.2;
luku = luku + 0.1;
System.out.println(luku);

Ohjelman tulostus on seuraava:

0.30000000000000004

Pyöristysvirheen vuoksi luku on 0.30000000000000004 eikä 0.3.