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