2016-05-15 6 views
0

So habe ich einige Code,Debugging Java-for-Schleife, die zu oft läuft

public static int getNumberAtDigit(int source, int digit) 
{ 
    if(digit > getSize(source)) 
     throw new IndexOutOfBoundsException(
       "There aren't " + String.valueOf(digit) + " digits in " + String.valueOf(source) + "."); 
    else 
    { 
     // Remove digits that come after what we want 
     for(int i = getSize(source); i > digit; i--) 
      source = (int) Math.floor(digit/10); 
     //Narrow it to only the last digit and return it 
     return source % 10; 
    } 
} 

public static int getSize(long d) 
{ 
    String numberS = String.valueOf(d); 
    return numberS.length(); 
} 

und wenn ich System.out.println(getNumberAtDigit(4532, 3)); führen Sie es 0 zurück, aber wenn ich System.out.println(getNumberAtDigit(4532, 4)); laufen es gibt 2, wie es sollte. Ich habe getestet und weiß, dass die Methode getSize(long d) nicht der Schuldige ist und normal funktioniert. Ich glaube, dass die for-Schleife zu oft läuft, aber es nicht herausfinden kann. Was mache ich falsch?

+0

Warum nicht einfach 'digit/10' anstelle von' (int) Math.floor (digit/10) '? – MikeCAT

+0

Beachten Sie auch, dass das, was in 'source' eingegeben wird, und der Schleifenzähler' i' nicht zur Rückgabe führt, es sei denn, digit = = getSize (source) ': nur' digit' bestimmt, was für 'digit MikeCAT

+0

Um sicherzustellen, dass es nicht aufrundet, wenn es teilt, aber seit Sie kommentiert, dass ich davon ausgehe, dass es automatisch abrundet. – Pyrrhic

Antwort

1

Hier ist Ihr Problem:

source = (int) Math.floor(digit/10); 

Wenn der Wert von digit kleiner als 10 ist, wird diese Funktion immer wieder zurückkehren 0. Ich glaube, was Sie gemeint ist Math.floor(source/10) zu tun zu verwenden.

1

Es sollte source = (int) Math.floor(source/10);, nicht source = (int) Math.floor(digit/10); sein, weil es mir egal ist, was digit/10 ist. Ich bin so klug :)