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