Python 整数除法四舍五入

Python 整数除法四舍五入,python,rounding,integer-division,Python,Rounding,Integer Division,有没有一种简单的、类似于Python的方法,可以不使用浮点数而四舍五入到最接近的整数?我想使用整数算术执行以下操作: skip = int(round(1.0 * total / surplus)) ============== @约翰:浮点是不能跨平台复制的。如果你想让你的代码通过不同平台的测试,那么你需要避免浮点运算(或者在你的测试中加入一些骇人的espilon代码,希望它能工作)。以上内容可能很简单,在大多数/所有平台上都是一样的,但我不想做出这样的决定,因为完全避免浮点比较容易。这怎么

有没有一种简单的、类似于Python的方法,可以不使用浮点数而四舍五入到最接近的整数?我想使用整数算术执行以下操作:

skip = int(round(1.0 * total / surplus))
==============

@约翰:浮点是不能跨平台复制的。如果你想让你的代码通过不同平台的测试,那么你需要避免浮点运算(或者在你的测试中加入一些骇人的espilon代码,希望它能工作)。以上内容可能很简单,在大多数/所有平台上都是一样的,但我不想做出这样的决定,因为完全避免浮点比较容易。这怎么会“不符合Python的精神”

除了一切都乘以2,然后再除以2,这是可以用整数算术实现的(因为位移位不需要浮点)。

这也应该可以:

def rint(n):
    return (int(n+.5) if n > 0 else int(n-.5))

在进行除法之前,只需注意四舍五入规则。对于最简单的四舍五入:

if total % surplus < surplus / 2:
    return total / surplus
else:
    return (total / surplus) + 1
如果总盈余百分比<盈余/2:
回报总额/盈余
其他:
收益(总收益/盈余)+1

如果您需要进行适当的一轮调整以达到平衡,请稍作调整。

您可以非常简单地执行此操作:

(n+d//2)//d
,其中
n
是被除数,
d
是除数

类似于
((n>1
或等效的
((n*2)//d)+1)//2
的替代方案在最近的CPythons中可能会更慢,其中
int
的实现方式与旧的
long
类似

简单方法执行3个变量访问、1个常量加载和3个整数操作。复杂方法执行2个变量访问、3个常量加载和4个整数操作。整数操作可能需要时间,这取决于所涉及的数字的大小。函数局部变量访问不涉及“查找”

如果你真的对速度感到失望,那么就做基准测试。否则,接吻。

另一种有趣的方式:

q, r = divmod(total, surplus)
skip = q + int(bool(r))
灵感来源于答案,答案是

q, r = divmod(total, surplus)
skip = q + int(bool(r)) # rounds to next greater integer (always ceiling)
,我提出了以下解决方案:

q, r = divmod(total, surplus) 
skip = q + int(2 * r >= surplus) # rounds to nearest integer (floor or ceiling)
由于OP要求四舍五入到最接近的整数,zhmhs的解决方案实际上有点不正确,因为它总是四舍五入到下一个更大的整数,而我的解决方案按要求工作

(如果你觉得我的答案应该是对zhmh答案的编辑或评论,那么我要指出,我建议的编辑被拒绝了,因为它应该是评论,但我还没有足够的声誉来评论!)

如果您想知道如何定义
divmod
:根据

对于整数,结果与
(a//b,a%b)
相同


因此,我们坚持整数运算,正如OP所要求的那样。

正确的想法,但我认为您需要添加到
total
中的数量与
盈余相当。在您当前的公式中,我会将“+1”替换为“+盈余”,这可能是正确的。实际上,我只需要将1移到外部。:)这相当于在内部添加盈余,但需要更少的查找。谢谢!对于我来说,这在所有边缘情况下都能正常工作,这一点并不明显,我会检查以确定。我建议乘以2乘以2,然后除以2除以2,除非这是实际分析的、性能敏感的code.@John:Python中的long可以存储任意大的值,其中float是固定精度的,因此在范围、复杂性和可能的错误方面都要付出代价,将浮点引入整数运算。我真希望人们不要再用愚蠢的时髦词“Pythonic”来散布每一个问题,尽管如此。@GlennMaynard True!它不是很Pythical。+1此方法比位移位方法可读性更强,而且在Py 2.7上更快(在时间测试中)。模和除法运算符非常昂贵,此代码运行3个除法运算(一个模和2个常规除法),因此,如果代码需要快速,这不是最佳选择。这不是问题的答案,因为它涉及到
n+.5
@rubik我没有投反对票,那是另一个人。-@ArneL:好吧,没关系,如果它错了,投反对票是对的:)请注意,此解决方案舍入到下一个更大的整数,这不一定是最近的整数。请参阅我的答案,获得一个固定版本(在我还没有足够的评论声誉的时候发布)。
q, r = divmod(total, surplus)
skip = q + int(bool(r)) # rounds to next greater integer (always ceiling)
q, r = divmod(total, surplus) 
skip = q + int(2 * r >= surplus) # rounds to nearest integer (floor or ceiling)