Hvordan laver indsætter jeg en variabels værdi som har datatypen double til en variabel med datatypen int??
double minv;
int = minv2;
minv2 = minv;
(Dette giver error!)
På forhånd tak!
Java er det man kaldet et stærkt typet sprog, hvilket betyder at man ikke kan tildele en floating-point (kommatal) til en heltals variabel. Tilsvarende kan du heller ikke tildele en heltals variabel af typen long (64-bit heltal) til en heltals variabel af typen int (32-bit heltal).
For at tildele værdi til en variabel af forskellig type skal denne først konverteres til resultat typen. I visse tilfælde sker dette automatisk (Java gør det for dig), men i de fleste tilfælde er du selv nødsaget til at konvertere typen.
Eksempel (linjenummereret):
1: double min_double = 5;
2: int min_int = (int) min_double;
3: min_double = (double) min_int;
Forklaring:
(1) Her erklæres en double variabel med værdien 5. Læg mærke til at jeg ikke skrev
5.0, hvilket angiver en floating-point "konstant", men istedet
5 som angiver et heltal. Java konverterer altså automatisk 5 til 5.0 som er den ækvivalente floating-point repræsentant.
(2) Her er jeg tvunget til at konvertere min double værdi før jeg gemmer værdien i heltals variablen. Konverteringen af primitive typer sker vha. de indbyggede type-casting operatorer (int), (float), (double) osv. Disse operatorer svarer til at placere et '-' tegn foran sit tal/talvariabel, men istedet for at negere tallet, laves der om på typen.
(3) Her har jeg for eksemplets skyld type-castet heltallet til en double, men ligesom (1) er det ikke nødvendigt, Java skal nok gøre det for mig.
Men hvornår gør Java det så for mig og hvornår skal jeg gøre det selv?Java foretager en automatisk type-casting af primitive taltyper sålænge det er tale om "widening-conversion", dvs.
byte -> short -> int -> long -> float -> double
Sålænge du følger pilene er der tale om en "widening-conversion", idet man udvider den maksimale nummeriske størrelse (eng: range).
Konversion i den modsatte rækkefølge kaldes tilsvarende "narrowing-conversion" og skal gøres eksplicit (sker ikke automatisk), idet denne konversionsform hverken er præcisions eller størrelsesbevarende. En widening-conversion er tilsvarendel ikke præcisionsbevarende (når man konverterer mellem heltal og kommatal).
At en konversion ikke bevarer præcision betyder at der ikke er plads til alle talinformationerne i den nye taltype og man derfor bare finder den nærmeste repræsentant. Eksempelvis vil man opdage, at tager man det største mulige heltal af typen int samt det næststørste og konverterer begge til et kommatal af typen float, så vil begge kommatal være det samme!
At en konversion ikke bevarer størrelsesforhold betyder at den nye taltype ikke kan repræsentere tal i samme størrelsesleje. Man kunne så godt tænke at Java nok bare finder den nærmeste repræsentant i den nye taltype, men det er langt fra tilfældet. Konvertering mellem heltals typer sker nemlig vha. bit-beskæring frem for afrunding. Dvs. at man bare smider de bit væk som der ikke er plads til i den nye heltals type. Man kan derfor risikere at et positivt heltal bliver til et negativt heltal ved en narrowing-conversion.
Det var en længere smøre... håber du fik svar på dit spørgsmål :o)
[Redigeret d. 12/09-03 00:54:44 af Erik K. Aarslew-Jensen]