当前位置: 首页 > 面试题库 >

两个int的乘积为负

雷锋
2023-03-14
问题内容

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

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中修复,请尝试使用a long代替。

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

或相反的操作顺序

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


 类似资料:
  • 假设第一个输入行是这样的: 第二输入线为: 输出应为: 我试着把所有的数字放在一个单独的数组里。但我不知道如何找到所说的数组的乘积。输出大小应该是第一个数的大小+第二个数的大小。因此,如果产品大小较小,它应该有一个前导0。

  • 问题内容: 所以, 问题 我对行乘法有问题。在SQL中,有一个函数可以计算一组行中某个字段的总和。我想得到乘法,即表 这将是作为一个结果。我正在使用 DOUBLE 数据类型来存储我的数据值。 我的方法 从学校数学知道,-可以用来创建所需的表达式,例如: -在这里您会看到此方法的弱点-由于何时未定义-我需要在计算整个表达式之前计算负号。该小提琴提供了示例数据和对此的查询。另一个缺点是,我们需要确定列

  • 给定一个大小为n, n的数组

  • 给定N个数字,范围为-100.100。 要求重新排列元素以使产品价值之和最大。此任务中的乘积和定义为a1*a2+a2*a3..an-1*an 例如,给定数字10 20 50 40 30。 1,-2,3,-4,5,-6,7,-8,9,10,11,12,13,14,15,-16 预期的最大乘积为1342。 我的算法给出了下一个重排:

  • 看看以下片段: 结果如下: 无符号短常量

  • 问题内容: 这是我用Java写的代码…除此之外,还有什么有效的方法吗?我们还能进一步优化此代码吗? 问题答案: 我们假设最大的回文数将是6位而不是5位,因为143 * 777 = 111111是回文。 如其他地方所述,6位数的10进制回文数abccba是11的倍数。这是正确的,因为a * 100001 + b * 010010 + c * 001100等于11 * a * 9091 + 11 *