Python中的截断除法与地板除法

Python中的截断除法与地板除法,python,division,Python,Division,为了建立上下文,我只讨论整数算术,在大整数上,所以通过浮点运算不是一个选项,而使用负数,所以落地除法和截断除法之间的差异很重要 当对负整数执行除法时,典型的硬件和C系列编程语言会给出截断的结果,例如1/-2=0。Python2给出了详细的结果,例如1/-2=-1 尽管存在关于哪一个本质上更好的争论,但有没有办法让Python给出截断的结果?如果使用Python3而不是2,会有什么不同吗?Python3有一种新的除法(在Python2中,也可以使用来自的导入除法来触发这种除法): 我不认为你可以得

为了建立上下文,我只讨论整数算术,在大整数上,所以通过浮点运算不是一个选项,而使用负数,所以落地除法和截断除法之间的差异很重要

当对负整数执行除法时,典型的硬件和C系列编程语言会给出截断的结果,例如1/-2=0。Python2给出了详细的结果,例如1/-2=-1


尽管存在关于哪一个本质上更好的争论,但有没有办法让Python给出截断的结果?如果使用Python3而不是2,会有什么不同吗?

Python3有一种新的除法(在Python2中,也可以使用来自的导入除法来触发这种除法):


我不认为你可以得到截断除法,你可能必须使用math.floor()。

好的,如果你只是想要一个解决方案,记住
int
截断数字,所以不要做整数除法,用
int
截断浮点

int(1./-2)
如果您使用的是Python3.X,那么只需

int(1/2)
如果您希望在Py 2.X中实现相同的行为,请从未来导入分区

from __future__ import division
int(1/2)
如果你想知道这种行为的确切原因,请阅读这篇精彩的文章


看看您在使用float进行除法时遇到的困境,这里有一种替代方法,据我所测试,它似乎是有效的。请随时让我知道您面临的任何问题

>>> def trunc_div(a,b):
    q, r = divmod(a,b)
    if  q < 0 and r:
        q += 1
    return q

>>> trunc_div(1,-2)
0
>>> trunc_div(999999999999999999999999999999999999999999, -2)
-499999999999999999999999999999999999999999L
>>> trunc_div(999999999999999999999999999999999999999999, 2)
499999999999999999999999999999999999999999L
>>> trunc_div(1,2)
0
>>> 
def trunc分区(a、b): q、 r=divmod(a,b) 如果q<0和r: q+=1 返回q >>>trunc_分区(1,-2) 0 >>>trunc_div(999999999999999999999999999999999999,-2) -499999999999999999999999999999999999999999999L >>>trunc_分区(999999999999999999999999999999999999999999992) 499999999999999999999999999999999999999999999L >>>trunc_分区(1,2) 0 >>>
我认为这解决了您的问题,但这是一个函数调用,而不是一个简单的操作:

def truncdiv(a, b):
    if a < 0:
        a = -a
        b = -b
    if b < 0:
        return (a + b + 1) / b
    return a / b
def truncdiv(a、b)的

如果a<0:
a=-a
b=-b
如果b<0:
返回(a+b+1)/b
返回a/b
库支持截断除法:

>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>> 

免责声明:我维护gmpy2。

这是一个底层,而不是截断。再说一遍,我只讲整数算术,根本不涉及浮点运算。啊,是的,对不起,我把它们弄混了。试试
int(1000000000000000000000./2)
。。。(32位机器)再说一遍,我只讲整数算术,不讲浮点。我理解地板本质上更好的原因,但正如我所说,这是一个不同的问题;我在本文中寻找的是一种模拟典型硬件和编程语言行为的方法。@OmriBarel:感谢您进行压力测试,由于您,我有一个更新。请随意地强调和伸展你的思想:-)
divmod(-5,-2)=(2,-1)
,所以
trunc_div(-5,-2)=3
,这是错误的(应该是2)。@OmriBarel:比赛条件,我的修正和你的评论:-)。我错误地测试了余数而不是商
>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>>