Java-дивизон с двумя целочисленными операндами не работает? - PullRequest
1 голос
/ 13 ноября 2011

По какой-то причине моя математика просто возвращает 0. Значение установлено, я проверил.

int currentSize = 4079;
int totalSize = 500802;

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

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

Ответы [ 7 ]

8 голосов
/ 13 ноября 2011

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

int percentage = currentSize * 100 / totalSize;

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

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

.за счет работы с двойными или плавающими значениями.

4 голосов
/ 13 ноября 2011

вы используете 'int для currentSize и totalSize, что приводит к целочисленному делению , которое удаляет дробную часть, приводя к 0. Следовательно, процент всегда равен 0.

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

1 голос
/ 13 ноября 2011

Я полагаю, currentSize и totalSize равны int.

currentSize = 4079;
totalSize = 500802;

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

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

(double) currentSize

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

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

Весь код:

int currentSize = 3;
int totalSize = 100;

int percentage = (int) ((double) currentSize / totalSize * 100);
System.out.println(percentage);
0 голосов
/ 02 июля 2016

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

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

x / y дает 0.333333

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

0 голосов
/ 13 ноября 2011

Измените свой код на это:

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

Надеюсь, это поможет вам.:)

0 голосов
/ 13 ноября 2011

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

0 голосов
/ 13 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...