我目前正在编写一个小的下载管理器,尝试以百分比计算下载进度时会得到一个有趣的输出。这是我用来计算的:
int progress = (byte_counter * 100) / size; System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100) +" / "+size+" = "+progress);
byte-counter是一个int(它计算从中读取的总字节数InputStream),并且size是下载文件的长度(以字节为单位)。
byte-counter
InputStream
size
只需少量下载即可很好地工作。但是,当我使用较大的文件(40MB)时,它开始制作有趣的东西。计算的输出如下所示:
[...] (21473280 * 100) = 2147328000 / 47659008 = 45 (21474720 * 100) = 2147472000 / 47659008 = 45 (21476160 * 100) = -2147351296 / 47659008 = -45 (21477600 * 100) = -2147207296 / 47659008 = -45 [...]
我不知道为什么,但是计算结果为负。 由于正常的整数应该可以包含2 31 -1的数字,因此这不是问题的根源。但是我想念什么?
参见http://en.wikipedia.org/wiki/Arithmetic_overflow
要在Java中修复,请尝试使用a long代替。
long
int progress = (int) ((byte_counter * 100L) / size);
或相反的操作顺序
int progress = (int) (((float) byte_counter) / size) * 100);