В настоящее время я пишу небольшой менеджер загрузок, и я получаю забавный вывод, когда пытаюсь вычислить прогресс загрузки в процентах. Это то, что я использую для расчета:
int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
+" / "+size+" = "+progress);
byte-counter
— это целое число (подсчитывается общее количество байтов, прочитанных из InputStream
), а size
— это длина загруженного файла в байтах.
Это отлично работает с небольшими загрузками. Но когда я добираюсь до файлов большего размера (40 МБ), он начинает делать забавные вещи. Результат расчета выглядит следующим образом:
[...]
(21473280 * 100) = 2147328000 / 47659008 = 45
(21474720 * 100) = 2147472000 / 47659008 = 45
(21476160 * 100) = -2147351296 / 47659008 = -45
(21477600 * 100) = -2147207296 / 47659008 = -45
[...]
Не знаю почему, но расчет получается отрицательным. Поскольку обычный Integer должен работать с числами до 231-1, это не должно быть корнем проблемы. Но что я упускаю?
2^31-1
или2,147,483,647
. - person StriplingWarrior   schedule 19.05.2011