Alla kan vi göra nybörjarmisstag…

Jag tycker att jag själv är en rätt så duktig programmerare och sköter mitt jobb och tar fram den ena kodsnutten efter den andra och får allt att fungera, men jag måste erkänna; även jag gör nybörjarmisstag ibland!

Tänkte faktiskt dela med mig av ett här. Det tog mig någon timma innan jag gav mig själv en ”facepalm” och korrigerade felet på en sekund. Allt handlar om ”typecasting”, dvs när man konverterar ett objekt till ett annat objekt t.ex. (som i det här fallet) en double till int.

Bakgrund: Eftersom det i HTML finns en begränsning att ett input-fält inte kan ha mer än 32767 tecken så behövde jag i min kod räkna ut när jag överskrider ett fördefinierat tröskelvärde och därefter vidta åtgärder.

Så jag började med följande:


//Declared as constant in the top of the class!
private final int MAXIMUM_STRING_LENGTH = 32767;

public int getPercentOfFieldsize() {
int pct = 0;
try {
double testvalue = 16383;
pct = (int) Math.round( (testvalue / MAXIMUM_STRING_LENGTH)*100f);
System.out.println("Current pct: " + pct);
} catch (Exception e) {}
return pct;
}

Ok, så här långt är allt frid och fröjd. Jag fick ut att pct i det här fallet blev 50 och då visste jag att procentuträkningen var korrekt. Trodde jag. Jag ersatte därefter variablen testvalue med min genererade sträng:


String full = stringGenerator.toString();
int pct = (int) Math.round( (full.length() / MAXIMUM_STRING_LENGTH) * 100f);

Plötsligt blev resultatet 0! Detta trots att det borde ha varit runt 50 såsom mitt testvärde var. Ser Ni vad felet är?

Metoden .length() returnerar en int.

Konstanten MAXIMUM_STRING_LENGTH är en int.

Om du dividerar en int med en annan int så kommer resultatet att konverteras till en int innan det sker en multiplikation med 100f. Dela 16000 med 32767 och avrunda detta till en int och du får 0!

Lösningen var att konvertera konstanten till en double:


private final double MAXIMUM_STRING_LENGTH = 32767;

Då kommer nämligen att både täljare och nämnare att behandlas som double och divisionen returnera en double! *duh* Ett sådant billigt nybörjarmisstag…

Annonser

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: