什么是将奇数舍入到偶数的最佳方法?

时间:2014-03-03 18:54:10

标签: python math integer rounding legacy

当我偶然发现以下几行时,我正在对一些遗留代码进行现代化改造:

rounded_val = (len(src_string) / 2) * 2

它正在做的是利用Python's weird integer division来将字符串的长度值(如果是奇数)舍入到之前的第一个偶数值。但整数除法即将在Python 3上改变,我需要改变这一行。起初我想到了这个:

rounded_val = len(src_string) if len(src_string)%2 == 0 else len(src_string)-1

但是这会召唤len() 3次。然后我想到了使用原始想法,但是使用了地板除法运算符//,并认为这样做可能不太兼容,我应该使用math.floor()代替(但后来我需要)要为math进行另一次导入。

我可能会过度思考这个问题,但在Python中用最佳方法做什么呢?

PS:输出必须是整数。

5 个答案:

答案 0 :(得分:19)

如果您不喜欢依赖整数操作数的Python 2 //行为,请使用/分区代码:

rounded_val = (len(src_string) // 2) * 2

答案 1 :(得分:10)

也许

rounded_val = len(src_string) & ~1

这简单地清除1s位,这正是您所需要的。仅适用于int s,但len应始终为整数。

答案 2 :(得分:4)

这个怎么样:

rounded_val = len(src_string) & (-2)

虽然对不熟悉二进制算术的人来说有时并不明显。

答案 3 :(得分:2)

//运算符可能是您最好的选择,但您也可以使用divmod函数:

rounded_val = divmod(len(src_string), 2)[0] * 2

答案 4 :(得分:1)

为什么不这样:

rounded_val = len(src_string) - len(src_string) % 2