JAVA DUOMENŲ TIPAI

Java tipų konvertavimas

Tipų konvertavimas – vieno duomenų tipo reikšmės pavertimas kitu tipu, pavyzdžiui, int pavertimas į double. Java gali konvertuoti automatiškai arba reikalauti, kad tikslinį tipą nurodytum pats.

Du skaitinių tipų konvertavimo būdai

  • Tipo išplėtimas (widening) atliekamas automatiškai, kai Java leidžia reikšmę priskirti platesniam tipui.
  • Tipo siaurinimas (narrowing) nurodomas rankiniu būdu, tikslinį tipą parašant skliaustuose prieš reikšmę.
Skaitinių tipų keliai nėra viena tiesi grandinė.

byte gali plėstis į short, int, long, float ar double. char gali plėstis į int ir platesnius skaitinius tipus, tačiau short automatiškai nekonvertuojamas į char.

Automatinis tipo išplėtimas

Java automatiškai atlieka leidžiamą išplėtimą. Šiame pavyzdyje int reikšmė priskiriama double kintamajam be papildomos sintaksės:

int sveikasis = 9;
double trupmeninis = sveikasis; // Automatinis int -> double

System.out.println(sveikasis);  // 9
System.out.println(trupmeninis); // 9.0

Reikšmė 9 gali būti atvaizduota kaip double, todėl rezultatas parodomas kaip 9.0.

byte mazas = 100;
short trumpas = mazas;
int sveikasis = trumpas;
long ilgas = sveikasis;
double platus = ilgas;

char konvertavimas į skaičių

char reikšmę galima automatiškai priskirti int kintamajam. Gautas skaičius yra UTF-16 kodo vieneto skaitinė reikšmė:

char raide = 'A';
int unicodeKodas = raide;

System.out.println(unicodeKodas); // 65

Rankinis tipo siaurinimas

Siaurinant reikšmė gali nebetilpti į tikslinį tipą arba prarasti dalį informacijos. Todėl tikslinį tipą reikia aiškiai parašyti skliaustuose:

double trupmeninis = 9.78;
int sveikasis = (int) trupmeninis; // Rankinis double -> int

System.out.println(trupmeninis); // 9.78
System.out.println(sveikasis);   // 9

Konvertuojant 9.78 į int, trupmeninė dalis atmetama. Rezultatas yra 9, o ne matematiškai suapvalinta reikšmė 10.

Reikšmė gali netilpti

Tipas byte saugo reikšmes tik nuo −128 iki 127. Siaurinant didesnį int, pertekliniai bitai atmetami ir rezultatas gali būti netikėtas:

int skaicius = 130;
byte mazas = (byte) skaicius;

System.out.println(mazas); // -126
Siaurinimas nepatikrina verslo prasmės.

Prieš konvertuodamas patikrink, ar reikšmė telpa į tikslinio tipo intervalą.

Automatinis nereiškia visiškai tikslus

Java leidžia automatiškai konvertuoti int į float, tačiau float negali tiksliai atvaizduoti kiekvieno didelio sveikojo skaičiaus:

int tikslus = 16_777_217;
float apytikslis = tikslus;

System.out.println(tikslus);     // 16777217
System.out.println(apytikslis);  // 1.6777216E7

Išplėtimas yra leidžiamas be aiškios tipo nuorodos, tačiau pereinant iš int ar long į slankiojo kablelio tipą gali pasikeisti tikslumas. Tiksliems piniginiams skaičiavimams dažnai naudojamas , o ne float ar double.

Ką verta prisiminti?

  • Leidžiamą tipo išplėtimą Java dažniausiai atlieka automatiškai.
  • Siaurinant tikslinis tipas rašomas skliaustuose, pavyzdžiui, (int).
  • Konvertuojant trupmeninį skaičių į sveikąjį, trupmeninė dalis atmetama.
  • Siaurinant reikšmė gali perpildyti tikslinio tipo intervalą.
  • Automatinis konvertavimas į slankiojo kablelio tipą gali sumažinti tikslumą.