2015-09-10 4 views
1

Я пытаюсь получить двойной (результат из двух int int) как возвращаемое значение моей следующей функции.Кастинг int fraction to double

public static double getThresHold(int n) { 

    int i, j; 
    int openSites = 0; 
    Percolation percolation = new Percolation(n); 
    do { 
     i = StdRandom.uniform(n) + 1; 
     j = StdRandom.uniform(n) + 1; 
     if (!percolation.isOpen(i, j)) { 
      percolation.open(i, j); 
      openSites++; 
     } 
    } while (!percolation.percolates()); 

    double threshold = openSites * 1.0/n*n; 
    return threshold; 
} 

, но результат всегда не так, я получаю такие значения, как:

200.0 
240.0 
260.0 

Ожидаемый результат должен быть между 0.6 и 0.5

Что случилось с моим кодом!

Спасибо.

ответ

0

openSites * 1.0/n*n вычисляется слева направо, поэтому он эквивалентен ((openSites * 1.0)/n)*n, что равно openSites.

Вы должны использовать круглые скобки, чтобы заставить порядок операций, и вместо умножения на 1,0 вы можете заставить деление с плавающей точкой литья openSites в double:

double threshold = (double)openSites/(n*n); 

Это также будет работать, но я считаю его менее элегантным :

double threshold = openSites * 1.0/(n*n); 
+0

Благодарим вас за подробное объяснение, вы потрясающий;) – morfioce

0
double threshold = openSites * 1.0/(n*n); 

Просто добавьте скобки вокруг делителя. Кастинг для двойного не нужен, поскольку вы умножаете openSites на 1.0, что делает выражение openSites * 1.0 двойным.

Итак, ваша ошибка на самом деле не проблема кастинга, но вы сначала разделите openSites * 1.0 на n, а затем умножьте результат на n. Таким образом, в вашей версии вы в итоге получаете openSites * 1.0.

+0

Ровно спасибо :) – morfioce

Смежные вопросы