Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

 

Code Block
languagejava
titleCorrect casting
int i = 99;
byte b = (byte) i;
 
System.out.println(b);
 
// 99

i er innenfor verdiområdet til byte

 

Code Block
languagejava
titleIncorrect casting
int i = 500;
byte b = (byte) i;
 
System.out.println(b);

// -12  

i er utenfor verdiområdet tilbyte

 

 

Code Block
languagejava
titleHigher #bits
int i = Integer.MAX_VALUE;
long l = i;	

System.out.println(l);
 
// 2147483647

Trenger ikke caste "oppover"

Merk at Wrapperklassene (se lenger ned) gir støtte for konvertering mellom talltypene uten casting

Flyttall

Hva flyttall angår vil det vil sjeldent være grunn til å bruke noe annet enn double. Det som er viktig å bemerke seg er at et flyttall blir mindre og mindre nøyaktig desto større det blir og at man kan oppleve upresise beregninger selv med små verdier. 

 

Code Block
languagejava
titleLoss of precision
double d1 = 0.1;
System.out.println(d1); // 0.1

double d2 = 0.2;
System.out.println(d2); // 0.2
			
System.out.println(d1 + d2); // 0.30000000000000004 

// ??? 


Husk at vi prøver å representere flyttall med et begrenset antall bit, noe som
gir mulighet for feil. Presisjon er nøkkelordet, og som vist ovenfor er ikke denne
alltid helt perfekt. 

 

Code Block
languagejava
titleComparing double
double d1 = 0.1;
double d2 = 0.2;
double d3 = d1 + d2;
System.out.println( d3 == 0.3); // False

Med dette i bakhodet må vi alltid være varsomme når vi sammenligner 
doubleverdier. Ikke bruk ==, men heller en veldig liten epsilonverdi til å
filtrere bort små aritmetiske "feil".

Code Block
languagejava
titleEpsilonvalue
double eps = 0.00001;
 
System.out.println( (d3 - eps < 0.3) && (0.3 < d3 + eps)); // True
 

 

Double tar også tre "merkelige" verdier som er greit å vite om:

NaN: "Not a number", NaN kan tildeles en double dersom vi prøver å utføre operasjoner som ikke lar seg gjøre. Se under, eksempel 1.
Infinity: "Uendelig", Infinity er større enn alle tall, og følger noen enkle regler, eksempel 2.
-Infinity: "Negativ uendelig", -Infinity er mindre en alle tall, og følger de samme reglene som Infinity. 

Eksempel 1

Code Block
languagejava
titleNaN-code
double d1 = Math.sqrt(-1); // NaN
 
double inf = Double.POSITIVE_INFINITY;
 
double d2 = inf - inf; // NaN

 

Eksempel 2

Code Block
languagejava
titleInfinity
double pos_inf = Double.POSITIVE_INFINITY; // Infinity
double neg_inf = Double.NEGATIVE_INFINITY; // -Infinity
 
System.out.println(pos_inf - 10); // Infinity
System.out.println(neg_inf - 10); // -Infinity
System.out.println(pos_inf * -1); // -Infinity

 

...

Når vi ønsker å lagre tall i et Collection-objekt må tallene være objekter, men java har mekanismer som i mange tilfeller gjør dette for oss.
Mer om hvorfor vi initialiserer collections med et klassenavn her.

 

Code Block
languagejava
titleAdding objekt
List<Integer> list = ArrayList<Integer>();


list.add(Integer.valueOf(13)); // valueOf() refererer til et objekt


list.get(0) // En Integer

 

Som nevnt over har java mekanismer som konverterer for oss
dersom det er helt tydelig hvilke verdier og typer som forventes

Code Block
languagejava
titleAuto-converting
list.add(n) // oversettes til
list.add(Integer.valueOf(n)) // og

list.get(i) // oversettes til 
list.get(i).intValue()