2013-09-20 3 views
0

Я когда-то был в мире python и scala, поэтому не получая ответа или интерпретатора, действительно дает мне кошмары отладки. У меня есть следующий код:Разделите два значения, равные нулю

int count = someInteger; 
for (Map.Entry<String, Integer> entry : myMap.entrySet()) { 
    if(!entry.getKey().equals("20") && top5 < 5) { 
     String movie = entry.getKey(); 
     int xandy = entry.getValue(); 
     System.out.println(movie + "," + Float.toString(xandy/count)); 
     top5 += 1; 
    } 
} 

Проблема в том, что я получаю нуль от устройства. Я думал, что правильно обрабатываю переменные типа. Я попытался ответы, предоставленные, но все еще не работает, но проблема по-прежнему получать ноль:

Может ли это быть причиной проблемы:

Note: Recompile with -Xlint:unchecked for details. 
+1

У вас есть два ints, где два плавающих значения? – kosa

+0

xandy и count являются целыми числами, они не могут возвращать десятичные знаки, поэтому он возвращает 0, а затем вы получаете 0f – porfiriopartida

+0

, поэтому, если я это сделаю, он должен работать правильно '(float) xandy/(float) count;' но это не –

ответ

2

Попробуйте это:

int count = someInteger; 
for (Map.Entry<String, Integer> entry : myMap.entrySet()) { 
    if(!entry.getKey().equals("20") && top5 < 5) { 
     String movie = entry.getKey(); 
     int xandy = entry.getValue(); 
     System.out.println(movie + "," + Float.toString((float)xandy/(float)count)); 
     top5 += 1; 
    } 
} 

Обратите внимание на float cast для xandy и count

+0

Хотя это верно, 'cast' на одном из целых чисел было бы достаточно. –

+0

Не работает Я начинаю удивляться Примечание: перекомпиляция с -Xlint: непроверенная для деталей. если это имеет какое-либо отношение к проблеме. –

+0

Можете ли вы распечатать xandy, прежде чем пытаться разделить? Если xandy равно 0, то будет 0. – porfiriopartida

1

Выполнение целочисленного деления на Java, в результате чего получается целое число, поэтому любая десятичная часть деления усекается.

Чтобы получить коэффициент с плавающей запятой, сначала введите одну из переменных в качестве float или double, поэтому произойдет деление с плавающей запятой.

((float) xandy/count) 

По JLS, Section 15.17.2:

целочисленного деления раундов в стороне 0. То есть, фактор производства для операндов п и д, которые являются целыми числами после двоичного числового продвижения (§5.6.2) представляет собой целое значение q, величина которого как можно больше , удовлетворяя условию | d · q | ≤ | n |. Более того, q положительно, когда | n | ≥ | d | и n и d имеют один и тот же знак, но q отрицателен при | n | ≥ | d | и n и d имеют противоположные знаки.

Литье одного из них в float достаточно. Java будет продвигать другой операнд до float для соответствия типам, а затем выполнить деление.

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