2011-11-13 1 views
1

По какой-то причине моя математика просто возвращает 0. Значение установлено, я проверил.Java divison с двумя целыми операндами не работает?

int currentSize = 4079; 
int totalSize = 500802; 

int percentage = ((currentSize/totalSize) * 100); 
progdialog.setProgress(percentage); 

Процент всегда равняется проценту. Почему?

+1

Lemme догадка: '' currentSize' и totalSize' являются целыми числами ... – Mysticial

+0

@Mysticial Да, это было время так как я программировал на Java, и я знаю, что это будет очень глупо. EDIT: О, боже мой. Вау. Он должен быть десятичным, не так ли? –

+2

Я хочу начать составлять синтаксис в ответах, например «Просто используйте' currentSize.0/totalSize.0' ». –

ответ

6

Проблема, как указывали другие, представляет собой целочисленное деление, превратит что-нибудь меньшее, чем 1 в ноль. Это происходит до умножения на 100. Вы можете изменить порядок действий, чтобы получить что-то лучше:

int percentage = currentSize * 100/totalSize; 

Если вы обеспокоены округления, вы можете использовать

int percentage = (currentSize * 100 + (totalSize >> 1))/totalSize; 

Эти избежать расходов на работы с double или float.

+1

wtf? .......... – necromancer

+1

@agksmehx - В первом примере умножение происходит сначала, поэтому деление на 'totalSize' дает вам процентное значение int, которое требуется OP. (Умножение перед делением является способом избежать целочисленного деления, дающего преждевременное нулевое значение.) Второе делает то же самое, но добавляет половину 'totalSize' к числителю, так что после деления это похоже на добавление 0,5 до принятия целой части результата. –

+1

+1 этот ответ, если вы когда-либо видели, что программа останавливается из-за жесткой петли с плавающей точкой для индикатора выполнения. –

4

вы используете «ИНТ для currentSize и TotalSize, что приводит к целочисленного деления который удаляет дробную часть, что дает 0. Следовательно, процент всегда равен 0.

изменить его float percentage = (((float)currentSize/totalSize) * 100); и все будет хорошо

+0

результирующая процентная переменная также должна быть плавающей или двойной, иначе она будет равна нулю, если процент меньше 1, как в примере. – ophychius

+0

Ничего себе. Три ответа за 1 минуту. Спасибо, парни. Логическая ошибка. Сейчас 3 часа. –

+0

Правильно - изменил его на 'float percent = (((float) currentSize/totalSize) * 100);' – necromancer

0

Потому что результат вашего вычисления - это двойное значение со значением меньше 1. Вы помещаете его в целое число, чтобы оно обрезало все за разделителем десятичной дроби, что привело к нулю. Попробуйте вместо этого сохранить значение в double.

0

Если currentSize и totalSize являются целыми числами, этот расчет будет делать integer division,, который усечет вашу долю до 0. Используйте удвоения.

0

Измените код следующим образом:

double percentage = ((double)(currentSize/totalSize) * 100); 
progdialog.setProgress(percentage); 

Надеется, что это поможет YOUT. :)

+0

Это не поможет, если 'currentSize' и' totalSize' являются значениями int. Преобразование в 'double' произойдет только в конце (целых) операций справа. –

+0

теперь это нормально @Ted? –

+0

Гораздо лучше (при условии, что setProgress принимает двойной). –

1

Я предполагаю, что currentSize и totalSize являются int.

currentSize = 4079; 
totalSize = 500802; 

Если они есть, то currentSize/totalSize представляет собой целое деление. Результат не будет иметь дробной части (дробная часть удалена, не округляется). Поэтому результатом является 0.

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

(double) currentSize 

После расчета, если вы хотите, чтобы результат хранить в int, вы должны бросить (преобразовать двойной в целое, удалить дробную часть).

int percentage = (int) ((double) currentSize ... 

Весь код:

int currentSize = 3; 
int totalSize = 100; 

int percentage = (int) ((double) currentSize/totalSize * 100); 
System.out.println(percentage); 
-1

Java Разделение целых чисел дает нуль, если оба числитель и знаменатель являются целыми числами, и результат меньше 1. Fix:

Сделать любой из операндов плавающим или двойным , например. int x = 1; double y = 3.0;

х/у дает 0,333333

где, как 1/3 приводит 0.

+0

Разве вы не имеете в виду 'float x = 1.0f; float y = 3.0f; '? – nlloyd

+0

'int y = 3.0' превратит его в' 3', а 'x/y' по-прежнему будет целочисленным. Вы хотели бы сказать «double y = 3.0». Но об этом уже несколько раз ответили, поэтому я не знаю, что ваш ответ добавляет что-то здесь. – Teepeemm

+0

@nollyd int x = 1 и double y = 3.0 – Yergalem

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