在Python中截断与删除分区

时间:2013-03-26 09:43:43

标签: python division

为了建立上下文,我只讨论整数运算,在大整数上,所以通过浮点不是一个选项,并且使用负数,所以floored和truncated division之间的区别很重要。

当对负整数执行除法时,典型的硬件和C族编程语言会给出截断的结果,例如: 1 / -2 = 0.Python 2给出了内置结果,例如1 / -2 = -1。

尽管有关哪个本质上更好的论点,有没有办法让Python给出截断的结果?如果使用Python 3而不是2,它会有什么不同吗?

4 个答案:

答案 0 :(得分:7)

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

int(1./-2)

如果您使用的是Python 3.X,则只需执行

即可
int(1/2)

如果您希望将来在Py 2.X导入部门中使用相同的行为

from __future__ import division
int(1/2)

如果您想知道此行为的确切原因,请阅读这篇精彩的文章Why Python's Integer Division Floors


看看你使用浮动进行划分的困境,这是一种替代方法,似乎在我测试的过程中起作用。请随时告诉我您遇到的任何问题

>>> 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
>>> 

答案 1 :(得分:1)

Python 3具有新式划分(也可以在Python 2中使用from __future__ import division触发):

>>> from __future__ import division
>>> -1 / 2
-0.5
>>> -1 // 2
-1

我认为你不能截断分割,你可能不得不使用math.floor()。

答案 2 :(得分:1)

我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:

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

答案 3 :(得分:0)

gmpy2库支持截断分割:

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

免责声明:我维持gmpy2。