Luk*_*uth 2 java int download-manager
我正在编写一个小的下载管理器,当我尝试以百分比计算下载进度时,我得到一个有趣的输出.这是我用它来计算它:
int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
+" / "+size+" = "+progress);
Run Code Online (Sandbox Code Playgroud)
byte-counter是一个int(它计算从中读取的总字节数InputStream),size是下载文件的长度(以字节为单位).
这适用于小型下载.但是当我获得更大的文件(40MB)时,它开始制作有趣的东西.计算的输出如下所示:
[...]
(21473280 * 100) = 2147328000 / 47659008 = 45
(21474720 * 100) = 2147472000 / 47659008 = 45
(21476160 * 100) = -2147351296 / 47659008 = -45
(21477600 * 100) = -2147207296 / 47659008 = -45
[...]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但计算结果是否定的.因为正常的整数应该没有数字,直到2 31 -1,这不应该是根本问题.但是我错过了什么?
请参见http://en.wikipedia.org/wiki/Arithmetic_overflow
要修复java,请尝试使用long.
int progress = (int) ((byte_counter * 100L) / size);
Run Code Online (Sandbox Code Playgroud)
或逆操作顺序
int progress = (int) (((float) byte_counter) / size) * 100);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1077 次 |
| 最近记录: |