3

我想计算三个数字的平均值,例如:

d = int(round((a + b + c) / 3.0))

其中a, b, c,d是整数。

是否可以仅使用整数获得相同的结果?

由于性能原因,我对此感兴趣,我认为使用整数进行数学运算应该比使用浮点数更快。

上面的示例将整数转换为浮点数,计算结果,四舍五入并转换回整数。是否可以避免 int <-> float 转换?

4

4 回答 4

9

给定 1, 1, 2 -> 1 的要求;1, 2, 2 -> 2 那么这可以使用整数除法来完成。

使用 // 表示整数除法,使用 n 表示元素数。

average = ( a+ b + c + .... + n//2 ) // n

即总结所有值,然后添加一个数字来处理四舍五入。

正如@Henrik 的回答中所指出的,这假设所有数字都是正数。

于 2012-08-10T12:10:14.377 回答
3

(a + b + c + 1) / 3

解释:如果 (a + b + c) % 3 == 1,则向下取整;如果 (a + b + c) % 3 == 2,则四舍五入。

至少这应该适用于a + b + c >= 0. 您可能需要单独处理负值。

于 2012-08-10T12:06:56.283 回答
2

Mahmoud 答案的一种变体,仅使用一个除法:

d = (((a+b+c) * 10) + 15) / 30
于 2012-08-10T12:07:35.443 回答
1

它应该很简单:

d = (((a+b+c) * 10) / 3 + 5) / 10;
于 2012-08-10T12:02:56.470 回答