gpt4 book ai didi

java - 两个 int 相乘得到负数

转载 作者:行者123 更新时间:2023-12-02 07:35:25 26 4
gpt4 key购买 nike

我目前正在编写一个小下载管理器,当我尝试计算下载进度百分比时,我得到了一个有趣的输出。这是我用来计算的:

int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
+" / "+size+" = "+progress);

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
[...]

不知道为什么,计算结果为负。 由于普通整数应该可以处理 2 31-1 之前的数字,因此这不应该是问题根源。 但是我错过了什么?

最佳答案

参见http://en.wikipedia.org/wiki/Arithmetic_overflow

要在 java 中修复,请尝试使用 long 代替。

int progress = (int) ((byte_counter * 100L) / size);

或相反的操作顺序

int progress = (int) (((float) byte_counter) / size) * 100);

关于java - 两个 int 相乘得到负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com