我想计算三个数字的平均值,例如:
d = int(round((a + b + c) / 3.0))
其中a
, b
, c
,d
是整数。
是否可以仅使用整数获得相同的结果?
由于性能原因,我对此感兴趣,我认为使用整数进行数学运算应该比使用浮点数更快。
上面的示例将整数转换为浮点数,计算结果,四舍五入并转换回整数。是否可以避免 int <-> float 转换?
我想计算三个数字的平均值,例如:
d = int(round((a + b + c) / 3.0))
其中a
, b
, c
,d
是整数。
是否可以仅使用整数获得相同的结果?
由于性能原因,我对此感兴趣,我认为使用整数进行数学运算应该比使用浮点数更快。
上面的示例将整数转换为浮点数,计算结果,四舍五入并转换回整数。是否可以避免 int <-> float 转换?
给定 1, 1, 2 -> 1 的要求;1, 2, 2 -> 2 那么这可以使用整数除法来完成。
使用 // 表示整数除法,使用 n 表示元素数。
average = ( a+ b + c + .... + n//2 ) // n
即总结所有值,然后添加一个数字来处理四舍五入。
正如@Henrik 的回答中所指出的,这假设所有数字都是正数。
(a + b + c + 1) / 3
解释:如果 (a + b + c) % 3 == 1,则向下取整;如果 (a + b + c) % 3 == 2,则四舍五入。
至少这应该适用于a + b + c >= 0
. 您可能需要单独处理负值。
Mahmoud 答案的一种变体,仅使用一个除法:
d = (((a+b+c) * 10) + 15) / 30
它应该很简单:
d = (((a+b+c) * 10) / 3 + 5) / 10;