programmera.net -> java -> normal     för utskrift      info@programmera.net

Klassen java.lang.Math

1. Math
2. Konstanter
3. abs, max, och min
4. round, ciel och floor
5. pow och sqrt

1. Math

Om du vill göra lite mer avancerade numeriska beräkningar använder du Math. På denna sida listas några metoder och konstanter som klassen har. Några fakta man bör känna till om Math är:

  • Denna klass är helt statisk (har bara statiska medlemmar), alltså behöver kan man inte skapa ett objekt av klassen innan man använder den.
  • Eftersom klassen ligger i paketet lang behöver du heller inte importera den.
  • Klassen är final, så ingen klass kan ärva av Math.
Nedan ges en överblick av några intressanta metoder och konstanter:

Medlem Returtyp Beskrivning
PI  double  Konstanten Pi (ca: 3.14)
E  double  Konstanten E (ca: 2.71)
abs(x)  olika  Returnerar x eller -x om x är negativt
max(x,y)  olika  Returnerar det högsta värdet av x och y
min(x,y)  olika  Returnerar det minsta värdet av x och y
round(x)  olika  Avrundar x till närmaste heltal
ciel(x)  double  Avrundar x upp till närmaste heltal (men returtypen är double)
floor(x)  double  Avrundar x ner till närmaste heltal (men returnerar double)
sqrt(x)  double  Returnerar roten ur x
pow(x,y)  double  Returnerar x upphöjt till y
cos(x)  double  Returnerar Tangens av x, där x är radianer
sin(x)  double  Returnerar Sinus av x, där x är radianer
tan(x)  double  Returnerar Cosinus av x, där x är radianer
random()  double  Returnerar ett slumpvärde mellan 0 och 1

Vi ser att den vanligaste returtypen är double, men ibland kan andra typer också returneras. Hur detta går till förklaras i avsnitten nedan.

2. Konstanter

De konstanter du vanligtvis behöver i en beräkning är pi och talet e. Båda dessa är av typen double:
class TestPi{
  public static void main(String[] args){ 
    System.out.println("pi="+Math.PI);
    System.out.println("e="+Math.E);
  }
}
Utskriften blir:
[olle@dev1]$ java TestPi
pi=3.141592653589793
e=2.718281828459045

3. abs, max, och min

Dessa metoder är överlagrade och har alltså olika returtyp beroende på argumentens typ. De kan returnera int, long, float, double. Kom ihåg att mindre typer automatiskt konverteras till int:
class TestMin{
  public static void main(String[] args){
    byte a=-2;
    byte b=1;
    int i;
    i=Math.min(a,b);
    System.out.println("min="+i);
  }
}
Vi får utskriften:
[olle@dev1]$ java TestMin
-2

4. round, ciel och floor

Metoden round är överlagrad. Om argumentets typ är float returneras en int. Om argumentets typ är double returneras long. Nedan ges ett exempel:
class TestRound{
  public static void main(String[] args){
    float f=2.3f;
    int i;
    i=Math.round(f); 
    System.out.println("round="+i);
  }
}
Vid kompilering får vi följande:
[olle@dev1]$ java TestRound
round=2
Av någon märklig anledning returnerar metoderna ciel och floor alltid double, trots att de avrundar till heltal:
class TestFloor{
  public static void main(String[] args){
    double ret,d=2.3;
    ret=Math.floor(d);
    System.out.println("floor="+ret);
  }
}
Föjlande program ger utskriften:
[olle@dev1]$ java TestFloor
ret=2.0

5. pow och sqrt

Här är ett exempel på hur du använder pow:
class TestMath{
  public static void main(String[] args){
    int i=3;  
    System.out.println("square="+Math.pow(i,2));
  }
}
Programmet skriver:
[olle@dev1]$ java TestMath
square=9.0
Metoden sqrt beräknar roten ur ett tal (square root). Ett vanligt misstag är att man glömmer att kontrollera att argumentet är större än noll. JVM reagerar inte på detta utan returnerar fridfullt Math.NaN (Not a Number).
class TestSqrt{
  public static void main(String[] args){
    int i=-2;
    double ret;
    ret=Math.sqrt(i); 
    System.out.println("root="+ret);
  }
}
Vi kör programmet:
[olle@dev1]$ java TestSqrt
root=NaN
Vill man kontrollera om man har NaN i en variabel, måste man använda funktionen isNaN:
class TestNN{
  public static void main(String[] args){
    if(Double.isNaN(Math.sqrt(-2))){
      System.out.println("Not A Number");
    }
  }
}
Programmet ger:
[olle@dev1]$ java TestNN
Not A Number